n8n Workflow

This commit is contained in:
Sedat Öztürk 2026-06-24 23:46:32 +03:00
parent c842bd6843
commit b1bd573905
8 changed files with 277 additions and 255 deletions

View file

@ -1,13 +1,12 @@
USE [Sozsoft]
GO
-- v12: Fully dynamic lookup dictionary. No hard-coded field-specific lookup rules.
CREATE OR ALTER PROCEDURE [dbo].[Sas_H_ListFormFieldsDictionaryJson]
@DefinitionCultureName NVARCHAR(10) = N'en', -- ListForm/ListFormField kayıt kültürü. Genelde en.
@UiCultureName NVARCHAR(10) = N'tr', -- Kullanıcıya görünen dil. Genelde tr.
@ListFormCode NVARCHAR(64) = NULL, -- Tek form istenirse.
@OnlyBaseDefinitions BIT = 1, -- 1 = UserId/RoleId özel kayıtları hariç.
@ResourceName NVARCHAR(64) = NULL -- Dil kaynağı filtrelenmek istenirse.
@DefinitionCultureName NVARCHAR(10) = N'en',
@UiCultureName NVARCHAR(10) = N'tr',
@ListFormCode NVARCHAR(64) = NULL,
@OnlyBaseDefinitions BIT = 1,
@ResourceName NVARCHAR(64) = NULL
AS
BEGIN
SET NOCOUNT ON;
@ -26,16 +25,7 @@ BEGIN
DescriptionValue = LT_DESC.[Value],
L.TableName,
SelectCommandText = NULLIF(LTRIM(RTRIM(CAST(L.SelectCommand AS NVARCHAR(MAX)))), N''),
L.SelectCommandType,
L.KeyFieldName,
L.KeyFieldDbSourceType,
L.ListFormType,
L.PageSize,
L.SortMode,
L.IsTenant,
L.IsBranch,
L.IsOrganizationUnit,
L.IsSubForm,
L.UserId,
L.RoleId
FROM dbo.Sas_H_ListForm L
@ -75,42 +65,24 @@ BEGIN
OR (L.UserId IS NULL AND L.RoleId IS NULL)
)
)
SELECT
SELECT CAST(
(
SELECT
L.ListFormCode AS [formCode],
L.ListFormCode AS [listFormCode],
L.CultureName AS [definitionCulture],
@UiCultureName AS [uiCulture],
ISNULL(CAST(L.NameValue AS NVARCHAR(MAX)), ISNULL(L.Name, N'')) AS [displayName],
ISNULL(CAST(L.NameValue AS NVARCHAR(MAX)), ISNULL(L.Name, N'')) AS [nameValue],
ISNULL(CAST(L.TitleValue AS NVARCHAR(MAX)), ISNULL(L.Title, N'')) AS [title],
ISNULL(CAST(L.TitleValue AS NVARCHAR(MAX)), ISNULL(L.Title, N'')) AS [titleValue],
ISNULL(CAST(L.DescriptionValue AS NVARCHAR(MAX)), ISNULL(L.Description, N'')) AS [description],
ISNULL(CAST(L.DescriptionValue AS NVARCHAR(MAX)), ISNULL(L.Description, N'')) AS [descriptionValue],
ISNULL(L.TableName, N'') AS [sqlTableName],
ISNULL(L.TableName, N'') AS [tableName],
ISNULL(L.SelectCommandText, N'') AS [selectCommand],
ISNULL(COALESCE(NULLIF(L.TableName, N''), L.SelectCommandText), N'') AS [sqlSourceName],
CASE
WHEN COALESCE(NULLIF(L.TableName, N''), L.SelectCommandText) IS NULL THEN N'unknown'
WHEN UPPER(LTRIM(COALESCE(NULLIF(L.TableName, N''), L.SelectCommandText))) LIKE N'SELECT%' THEN N'selectSql'
ELSE N'table'
END AS [sourceKind],
L.SelectCommandType AS [selectCommandType],
ISNULL(L.KeyFieldName, N'') AS [primaryKeyColumn],
ISNULL(L.KeyFieldName, N'') AS [keyFieldName],
L.KeyFieldDbSourceType AS [keyFieldDbSourceType],
L.ListFormType AS [listFormType],
L.PageSize AS [pageSize],
L.SortMode AS [sortMode],
CONVERT(bit, L.IsTenant) AS [isTenant],
CONVERT(bit, L.IsBranch) AS [isBranch],
CONVERT(bit, L.IsOrganizationUnit) AS [isOrganizationUnit],
CONVERT(bit, L.IsSubForm) AS [isSubForm],
CONCAT_WS(N' ',
L.ListFormCode,
@ -125,97 +97,105 @@ BEGIN
(
(
SELECT
F.FieldName AS [sqlColumnName],
F.FieldName AS [field],
ISNULL(CAST(LT_CAP.[Value] AS NVARCHAR(MAX)), ISNULL(F.CaptionName, N'')) AS [displayName],
ISNULL(CAST(LT_CAP.[Value] AS NVARCHAR(MAX)), ISNULL(F.CaptionName, N'')) AS [captionValue],
ISNULL(F.CaptionName, N'') AS [captionKey],
F.SourceDbType AS [sourceDbType],
SC.SqlDataType AS [sqlDataType],
SC.SqlMaxLength AS [sqlMaxLength],
F.ListOrderNo AS [listOrderNo],
CONVERT(bit, ISNULL(F.Visible, 1)) AS [isVisible],
CONVERT(bit, CASE
WHEN SC.SqlDataType = N'bit' THEN 1
WHEN F.FieldName LIKE N'Is%' THEN 1
WHEN F.FieldName LIKE N'Has%' THEN 1
WHEN F.FieldName IN (N'Monday', N'Tuesday', N'Wednesday', N'Thursday', N'Friday', N'Saturday', N'Sunday') THEN 1
WHEN F.FieldName IN (N'EmailConfirmed', N'TwoFactorEnabled', N'IsVerified', N'IsDefault', N'IsPublic', N'IsEnabled', N'IsPublished', N'IsPinned', N'IsAnonymous', N'IsFixed', N'IsCustomized', N'IsEncrypted', N'IsInherited', N'ZipRequired', N'StateRequired') THEN 1
WHEN F.FieldName IN
(
N'Monday', N'Tuesday', N'Wednesday', N'Thursday',
N'Friday', N'Saturday', N'Sunday'
) THEN 1
WHEN F.FieldName IN
(
N'EmailConfirmed', N'TwoFactorEnabled', N'IsVerified',
N'IsDefault', N'IsPublic', N'IsEnabled', N'IsPublished',
N'IsPinned', N'IsAnonymous', N'IsFixed', N'IsCustomized',
N'IsEncrypted', N'IsInherited', N'ZipRequired', N'StateRequired'
) THEN 1
ELSE 0
END) AS [isBooleanColumn],
F.ListOrderNo AS [listOrderNo],
F.Width AS [width],
F.Alignment AS [alignment],
F.Format AS [format],
CONVERT(bit, ISNULL(F.Visible, 1)) AS [isVisible],
CONVERT(bit, ISNULL(F.IsActive, 1)) AS [isActive],
CONVERT(bit, ISNULL(F.AllowSearch, 0)) AS [allowSearch],
CONVERT(bit, ISNULL(F.AllowEditing, 1)) AS [allowEditing],
CONVERT(bit, ISNULL(F.AllowAdding, 1)) AS [allowAdding],
CONVERT(bit, CASE WHEN LJ.LookupJsonText IS NOT NULL THEN 1 ELSE 0 END) AS [hasLookup],
CONVERT(bit, CASE WHEN LJ.LookupJsonText IS NOT NULL THEN 1 ELSE 0 END) AS [isLookupColumn],
LJ.LookupJsonText AS [lookupJsonText],
JSON_QUERY(CASE WHEN ISJSON(LJ.LookupJsonText) = 1 THEN LJ.LookupJsonText ELSE NULL END) AS [lookupJson],
LJ.JoinTableJsonText AS [joinTableJsonText],
JSON_QUERY(CASE WHEN ISJSON(LJ.JoinTableJsonText) = 1 THEN LJ.JoinTableJsonText ELSE NULL END) AS [joinTableJson],
LKE.ParsedLookupTableName AS [parsedLookupTableName],
LK.ParsedLookupValueColumn AS [parsedLookupValueColumn],
LK.ParsedLookupDisplayColumn AS [parsedLookupDisplayColumn],
LJ.LookupJsonTextDecoded AS [lookupJsonText],
CASE WHEN ISJSON(LJ.LookupJsonText) = 1 THEN COALESCE(
JSON_VALUE(LJ.LookupJsonText, '$.listFormCode'),
JSON_VALUE(LJ.LookupJsonText, '$.formCode'),
JSON_VALUE(LJ.LookupJsonText, '$.lookupListFormCode'),
JSON_VALUE(LJ.LookupJsonText, '$.dataSource.listFormCode'),
JSON_VALUE(LJ.LookupJsonText, '$.dataSource.formCode')
) END AS [lookupListFormCode],
COALESCE(
CASE WHEN ISJSON(LJ.LookupJsonText) = 1 THEN COALESCE(
JSON_VALUE(LJ.LookupJsonText, '$.tableName'),
JSON_VALUE(LJ.LookupJsonText, '$.sqlTableName'),
JSON_VALUE(LJ.LookupJsonText, '$.lookupTableName'),
JSON_VALUE(LJ.LookupJsonText, '$.dataSource.tableName'),
JSON_VALUE(LJ.LookupJsonText, '$.dataSource.sqlTableName')
CASE WHEN ISJSON(LJ.LookupJsonTextDecoded) = 1 THEN COALESCE(
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.tableName'),
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.sqlTableName'),
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.lookupTableName'),
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.dataSource.tableName'),
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.dataSource.sqlTableName')
) END,
LKE.ParsedLookupTableName
LKP.ParsedLookupTableName
) AS [lookupTableName],
COALESCE(
CASE WHEN ISJSON(LJ.LookupJsonText) = 1 THEN COALESCE(
JSON_VALUE(LJ.LookupJsonText, '$.valueExpr'),
JSON_VALUE(LJ.LookupJsonText, '$.valueField'),
JSON_VALUE(LJ.LookupJsonText, '$.valueColumn'),
JSON_VALUE(LJ.LookupJsonText, '$.keyField'),
JSON_VALUE(LJ.LookupJsonText, '$.keyFieldName')
) END,
LK.ParsedLookupValueColumn
) AS [lookupValueColumn],
COALESCE(
CASE WHEN ISJSON(LJ.LookupJsonText) = 1 THEN COALESCE(
JSON_VALUE(LJ.LookupJsonText, '$.displayExpr'),
JSON_VALUE(LJ.LookupJsonText, '$.displayField'),
JSON_VALUE(LJ.LookupJsonText, '$.displayColumn'),
JSON_VALUE(LJ.LookupJsonText, '$.textField'),
JSON_VALUE(LJ.LookupJsonText, '$.textColumn'),
JSON_VALUE(LJ.LookupJsonText, '$.nameField'),
JSON_VALUE(LJ.LookupJsonText, '$.nameColumn')
) END,
LK.ParsedLookupDisplayColumn
) AS [lookupDisplayColumn],
CASE
WHEN LJ.LookupJsonText IS NOT NULL AND F.FieldName NOT LIKE N'%Id' AND COALESCE(LK.ParsedLookupValueColumn, N'') IN (N'Name', N'Code', N'Key', N'Value') THEN N'direct-string'
WHEN LJ.LookupJsonText IS NOT NULL OR F.FieldName LIKE N'%Id' THEN N'convert-nvarchar-safe'
END AS [lookupJoinMode],
CASE
WHEN LJ.LookupJsonText IS NOT NULL AND F.FieldName NOT LIKE N'%Id' AND COALESCE(LK.ParsedLookupValueColumn, N'') IN (N'Name', N'Code', N'Key', N'Value') THEN N'ON base.lookupColumn = lookup.valueColumn'
WHEN LJ.LookupJsonText IS NOT NULL OR F.FieldName LIKE N'%Id' THEN N'ON CONVERT(NVARCHAR(100), base.lookupColumn) = CONVERT(NVARCHAR(100), lookup.valueColumn)'
END AS [lookupJoinRule],
CONVERT(bit, CASE
WHEN LJ.LookupJsonText IS NOT NULL
AND F.FieldName NOT LIKE N'%Id'
THEN 1 ELSE 0 END) AS [lookupFallbackToSourceColumn],
CASE WHEN LJ.LookupJsonText IS NOT NULL THEN CONCAT_WS(N' ', F.FieldName, F.CaptionName, CAST(LT_CAP.[Value] AS NVARCHAR(MAX)), LJ.LookupJsonText, LJ.JoinTableJsonText) END AS [lookupSearchText],
CONVERT(bit, CASE WHEN F.FieldName IN (N'IsActive', N'IsEnabled', N'IsPublished') THEN 1 ELSE 0 END) AS [isActiveStatusColumn],
CONVERT(bit, CASE WHEN F.FieldName IN (N'IsDeleted', N'Deleted', N'IsRemoved') THEN 1 ELSE 0 END) AS [isDeletedStatusColumn],
COALESCE(
CASE WHEN ISJSON(LJ.LookupJsonTextDecoded) = 1 THEN COALESCE(
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.valueExpr'),
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.valueField'),
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.valueColumn'),
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.keyField'),
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.keyFieldName')
) END,
LKP.ParsedLookupValueColumn
) AS [lookupValueColumn],
COALESCE(
CASE WHEN ISJSON(LJ.LookupJsonTextDecoded) = 1 THEN COALESCE(
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.displayExpr'),
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.displayField'),
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.displayColumn'),
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.textField'),
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.textColumn'),
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.nameField'),
JSON_VALUE(LJ.LookupJsonTextDecoded, '$.nameColumn')
) END,
LKP.ParsedLookupDisplayColumn
) AS [lookupDisplayColumn],
CASE
WHEN LJ.LookupJsonTextDecoded IS NOT NULL AND F.FieldName NOT LIKE N'%Id'
AND COALESCE(LKP.ParsedLookupValueColumn, N'') IN (N'Name', N'Code', N'Key', N'Value', N'key', N'value')
THEN N'direct-string'
WHEN LJ.LookupJsonTextDecoded IS NOT NULL AND F.FieldName NOT LIKE N'%Id'
THEN N'direct-string'
WHEN LJ.LookupJsonTextDecoded IS NOT NULL OR F.FieldName LIKE N'%Id'
THEN N'convert-nvarchar-safe'
END AS [lookupJoinMode],
CONVERT(bit, CASE
WHEN LJ.LookupJsonTextDecoded IS NOT NULL
AND F.FieldName NOT LIKE N'%Id'
THEN 1 ELSE 0
END) AS [lookupFallbackToSourceColumn],
CASE
WHEN LJ.LookupJsonTextDecoded IS NOT NULL
THEN CONCAT_WS(N' ',
F.FieldName,
F.CaptionName,
CAST(LT_CAP.[Value] AS NVARCHAR(MAX)),
LJ.LookupJsonTextDecoded
)
END AS [lookupSearchText],
CONVERT(bit, CASE
WHEN F.FieldName IN (N'IsActive', N'IsEnabled', N'IsPublished')
THEN 1 ELSE 0
END) AS [isActiveStatusColumn],
CONVERT(bit, CASE
WHEN F.FieldName IN (N'IsDeleted', N'Deleted', N'IsRemoved')
THEN 1 ELSE 0
END) AS [isDeletedStatusColumn],
CONVERT(bit, CASE
WHEN F.FieldName LIKE N'%Password%'
OR F.FieldName LIKE N'%ConnectionString%'
@ -223,7 +203,9 @@ BEGIN
OR F.FieldName LIKE N'%Secret%'
OR F.FieldName LIKE N'%ApiKey%'
OR F.FieldName LIKE N'%PrivateKey%'
THEN 1 ELSE 0 END) AS [isSensitive],
THEN 1 ELSE 0
END) AS [isSensitive],
CONVERT(bit, CASE
WHEN ISNULL(F.Visible, 1) = 1
AND ISNULL(F.IsActive, 1) = 1
@ -234,21 +216,14 @@ BEGIN
AND F.FieldName NOT LIKE N'%ApiKey%'
AND F.FieldName NOT LIKE N'%PrivateKey%'
AND F.FieldName NOT IN (N'Avatar', N'ExtraProperties')
THEN 1 ELSE 0 END) AS [isDefaultSelectColumn]
THEN 1 ELSE 0
END) AS [isDefaultSelectColumn]
FROM dbo.Sas_H_ListFormField F
OUTER APPLY
(
SELECT
LookupJsonText = NULLIF(LTRIM(RTRIM(CAST(F.LookupJson AS NVARCHAR(MAX)))), N''),
JoinTableJsonText = NULLIF(LTRIM(RTRIM(CAST(F.JoinTableJson AS NVARCHAR(MAX)))), N'')
) LJ
OUTER APPLY
(
SELECT TOP (1)
SqlDataType = TYPE_NAME(C.user_type_id),
SqlMaxLength = C.max_length,
SqlPrecision = C.precision,
SqlScale = C.scale
SqlDataType = TYPE_NAME(C.user_type_id)
FROM sys.schemas S
INNER JOIN sys.tables TBL ON TBL.schema_id = S.schema_id
INNER JOIN sys.columns C ON C.object_id = TBL.object_id
@ -259,77 +234,120 @@ BEGIN
OUTER APPLY
(
SELECT
CleanLookupSql = NULLIF(
LTRIM(RTRIM(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(CAST(F.LookupJson AS NVARCHAR(MAX)), N'\\u0022', N''),
N'\u0022', N''),
N'"', N''),
N'"', N''),
N'[', N''),
N']', N''),
N'`', N''),
N'\', N''),
CHAR(13) + CHAR(10), N' ')
)),
N'')
) LKC
LookupJsonTextRaw = NULLIF(LTRIM(RTRIM(CAST(F.LookupJson AS NVARCHAR(MAX)))), N'')
) LJR
OUTER APPLY
(
SELECT
UpperLookupSql = UPPER(LKC.CleanLookupSql),
FromPos = CHARINDEX(N' FROM ', UPPER(LKC.CleanLookupSql)),
OrderPos = CHARINDEX(N' ORDER BY ', UPPER(LKC.CleanLookupSql)),
WherePos = CHARINDEX(N' WHERE ', UPPER(LKC.CleanLookupSql)),
GroupPos = CHARINDEX(N' GROUP BY ', UPPER(LKC.CleanLookupSql))
) LKP
LookupJsonTextDecoded = NULLIF(LTRIM(RTRIM(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
LJR.LookupJsonTextRaw,
N'\\u0022', N'"'),
N'\u0022', N'"'),
N'\\u0027', N''''),
N'\u0027', N''''),
N'"', N'"')
)), N'')
) LJ
OUTER APPLY
(
SELECT
LookupQueryText = CASE
WHEN ISJSON(LJ.LookupJsonTextDecoded) = 1
THEN JSON_VALUE(LJ.LookupJsonTextDecoded, '$.LookupQuery')
END
) LQ
OUTER APPLY
(
SELECT
CleanLookupQuery = NULLIF(LTRIM(RTRIM(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
LQ.LookupQueryText,
N'"', N''),
N'[', N''),
N']', N''),
N'`', N''),
NCHAR(13), N' '),
NCHAR(10), N' '),
NCHAR(9), N' '),
N' ', N' ')
)), N'')
) LQC
OUTER APPLY
(
SELECT
FromPos = CHARINDEX(N' FROM ', UPPER(ISNULL(LQC.CleanLookupQuery, N''))),
OrderPos = CHARINDEX(N' ORDER BY ', UPPER(ISNULL(LQC.CleanLookupQuery, N''))),
WherePos = CHARINDEX(N' WHERE ', UPPER(ISNULL(LQC.CleanLookupQuery, N''))),
GroupPos = CHARINDEX(N' GROUP BY ', UPPER(ISNULL(LQC.CleanLookupQuery, N''))),
SelectPart = CASE
WHEN CHARINDEX(N' FROM ', UPPER(ISNULL(LQC.CleanLookupQuery, N''))) > 0
THEN LTRIM(RTRIM(SUBSTRING(
LQC.CleanLookupQuery,
7,
CHARINDEX(N' FROM ', UPPER(LQC.CleanLookupQuery)) - 7
)))
END
) LQP
OUTER APPLY
(
SELECT
StopPos = CASE
WHEN LKP.FromPos <= 0 THEN 0
WHEN LKP.WherePos > LKP.FromPos THEN LKP.WherePos
WHEN LKP.GroupPos > LKP.FromPos THEN LKP.GroupPos
WHEN LKP.OrderPos > LKP.FromPos THEN LKP.OrderPos
ELSE LEN(LKC.CleanLookupSql) + 1
WHEN LQP.FromPos <= 0 THEN 0
WHEN LQP.WherePos > LQP.FromPos THEN LQP.WherePos
WHEN LQP.GroupPos > LQP.FromPos THEN LQP.GroupPos
WHEN LQP.OrderPos > LQP.FromPos THEN LQP.OrderPos
ELSE LEN(LQC.CleanLookupQuery) + 1
END
) LQS
OUTER APPLY
(
SELECT
ParsedLookupTableName = CASE
WHEN LQP.FromPos > 0 AND LQS.StopPos > LQP.FromPos
THEN NULLIF(REPLACE(REPLACE(LEFT(
LTRIM(RTRIM(SUBSTRING(
LQC.CleanLookupQuery,
LQP.FromPos + 6,
LQS.StopPos - (LQP.FromPos + 6)
))),
CHARINDEX(N' ', LTRIM(RTRIM(SUBSTRING(
LQC.CleanLookupQuery,
LQP.FromPos + 6,
LQS.StopPos - (LQP.FromPos + 6)
))) + N' ') - 1
), N'dbo.', N''), N'DBO.', N''), N'')
END,
SelectPart = CASE WHEN LKP.FromPos > 0 THEN LTRIM(RTRIM(SUBSTRING(LKC.CleanLookupSql, 7, LKP.FromPos - 7))) END
) LKS
OUTER APPLY
(
SELECT
TablePart = CASE WHEN LKP.FromPos > 0 AND LKS.StopPos > LKP.FromPos
THEN LTRIM(RTRIM(SUBSTRING(LKC.CleanLookupSql, LKP.FromPos + 6, LKS.StopPos - (LKP.FromPos + 6))))
END,
KeyAsPos = CHARINDEX(N' AS KEY', UPPER(ISNULL(LKS.SelectPart, N''))),
NameAsPos = CHARINDEX(N' AS NAME', UPPER(ISNULL(LKS.SelectPart, N'')))
) LKT
OUTER APPLY
(
SELECT
ParsedLookupTableName = NULLIF(REPLACE(REPLACE(LEFT(LKT.TablePart, CHARINDEX(N' ', LKT.TablePart + N' ') - 1), N'dbo.', N''), N'DBO.', N''), N''),
KeyExprChunk = CASE WHEN LKT.KeyAsPos > 0 THEN LTRIM(RTRIM(SUBSTRING(LKS.SelectPart, 1, LKT.KeyAsPos - 1))) END,
NameExprChunk = CASE WHEN LKT.NameAsPos > 0 THEN LTRIM(RTRIM(SUBSTRING(LKS.SelectPart, 1, LKT.NameAsPos - 1))) END
) LKE
OUTER APPLY
(
SELECT
ParsedLookupValueColumn = NULLIF(LTRIM(RTRIM(REPLACE(REPLACE(
CASE WHEN LKE.KeyExprChunk IS NOT NULL THEN
RIGHT(LKE.KeyExprChunk, CHARINDEX(N',', REVERSE(LKE.KeyExprChunk) + N',') - 1)
END, N'SELECT', N''), N'select', N''))), N''),
ParsedLookupDisplayColumn = NULLIF(LTRIM(RTRIM(REPLACE(REPLACE(
CASE WHEN LKE.NameExprChunk IS NOT NULL THEN
RIGHT(LKE.NameExprChunk, CHARINDEX(N',', REVERSE(LKE.NameExprChunk) + N',') - 1)
END, N'SELECT', N''), N'select', N''))), N'')
) LK
ParsedLookupValueColumn = COALESCE(
NULLIF(JSON_VALUE(LJ.LookupJsonTextDecoded, '$.ValueExpr'), N''),
NULLIF(JSON_VALUE(LJ.LookupJsonTextDecoded, '$.valueExpr'), N''),
NULLIF(JSON_VALUE(LJ.LookupJsonTextDecoded, '$.valueField'), N''),
NULLIF(JSON_VALUE(LJ.LookupJsonTextDecoded, '$.valueColumn'), N''),
NULLIF(JSON_VALUE(LJ.LookupJsonTextDecoded, '$.keyField'), N''),
NULLIF(JSON_VALUE(LJ.LookupJsonTextDecoded, '$.keyFieldName'), N'')
),
ParsedLookupDisplayColumn = COALESCE(
NULLIF(JSON_VALUE(LJ.LookupJsonTextDecoded, '$.DisplayExpr'), N''),
NULLIF(JSON_VALUE(LJ.LookupJsonTextDecoded, '$.displayExpr'), N''),
NULLIF(JSON_VALUE(LJ.LookupJsonTextDecoded, '$.displayField'), N''),
NULLIF(JSON_VALUE(LJ.LookupJsonTextDecoded, '$.displayColumn'), N''),
NULLIF(JSON_VALUE(LJ.LookupJsonTextDecoded, '$.textField'), N''),
NULLIF(JSON_VALUE(LJ.LookupJsonTextDecoded, '$.textColumn'), N''),
NULLIF(JSON_VALUE(LJ.LookupJsonTextDecoded, '$.nameField'), N''),
NULLIF(JSON_VALUE(LJ.LookupJsonTextDecoded, '$.nameColumn'), N'')
)
) LKP
OUTER APPLY
(
SELECT TOP (1) LT.[Value]
@ -357,6 +375,7 @@ BEGIN
FROM ListFormSource L
ORDER BY L.ListFormCode
FOR JSON PATH, ROOT('listForms')
) AS ListFormDataDictionaryJson;
)
AS NVARCHAR(MAX)) AS ListFormDataDictionaryJson;
END
GO

View file

@ -1542,7 +1542,7 @@ public class PlatformDbContext :
b.Property(x => x.ResourceName).HasMaxLength(64);
b.Property(x => x.MaxForms).HasDefaultValue(500);
b.Property(x => x.CacheKey).HasMaxLength(512).IsRequired();
b.Property(x => x.JsonData).IsRequired();
b.Property(x => x.JsonData).IsRequired().HasColumnType("text");
b.Property(x => x.FormCount).HasDefaultValue(0);
b.Property(x => x.FieldCount).HasDefaultValue(0);
b.Property(x => x.JsonLength).HasDefaultValue(0);

View file

@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore;
namespace Sozsoft.Platform.Migrations
{
[DbContext(typeof(PlatformDbContext))]
[Migration("20260624135753_Initial")]
[Migration("20260624175615_Initial")]
partial class Initial
{
/// <inheritdoc />
@ -2005,7 +2005,7 @@ namespace Sozsoft.Platform.Migrations
b.Property<string>("JsonData")
.IsRequired()
.HasColumnType("nvarchar(max)");
.HasColumnType("text");
b.Property<int>("JsonLength")
.ValueGeneratedOnAdd()

View file

@ -1209,7 +1209,7 @@ namespace Sozsoft.Platform.Migrations
ResourceName = table.Column<string>(type: "nvarchar(64)", maxLength: 64, nullable: true),
MaxForms = table.Column<int>(type: "int", nullable: false, defaultValue: 500),
CacheKey = table.Column<string>(type: "nvarchar(512)", maxLength: 512, nullable: false),
JsonData = table.Column<string>(type: "nvarchar(max)", nullable: false),
JsonData = table.Column<string>(type: "text", nullable: false),
FormCount = table.Column<int>(type: "int", nullable: false, defaultValue: 0),
FieldCount = table.Column<int>(type: "int", nullable: false, defaultValue: 0),
JsonLength = table.Column<int>(type: "int", nullable: false, defaultValue: 0),

View file

@ -2002,7 +2002,7 @@ namespace Sozsoft.Platform.Migrations
b.Property<string>("JsonData")
.IsRequired()
.HasColumnType("nvarchar(max)");
.HasColumnType("text");
b.Property<int>("JsonLength")
.ValueGeneratedOnAdd()

File diff suppressed because one or more lines are too long

3
configs/ai/Kurulum.txt Normal file
View file

@ -0,0 +1,3 @@
docker exec -it ollama ollama list
docker exec -it ollama ollama pull qwen2.5:3b
docker exec -it ollama ollama pull gemma3:4b

View file

@ -428,7 +428,7 @@ const Assistant = () => {
+
</span>
</summary>
<pre className="mt-3 max-h-48 overflow-auto rounded-lg bg-gray-950 p-3 text-xs leading-5 text-emerald-100">
<pre className="mt-3 max-h-48 overflow-auto rounded-lg bg-gray-950 p-3 text-xs leading-5 text-emerald-100 [scrollbar-color:#6b7280_transparent] [scrollbar-width:thin] [&::-webkit-scrollbar]:h-2 [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-gray-500 [&::-webkit-scrollbar-thumb:hover]:bg-gray-400 [&::-webkit-scrollbar-track]:bg-transparent">
<code>{cleanedSql}</code>
</pre>
</details>
@ -439,7 +439,7 @@ const Assistant = () => {
Sonuç bulunamadı.
</div>
) : (
<div className="max-h-[400px] overflow-auto">
<div className="max-h-[400px] overflow-auto pb-1 [scrollbar-color:#6b7280_transparent] [scrollbar-width:thin] [&::-webkit-scrollbar]:h-2 [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-gray-400 [&::-webkit-scrollbar-thumb:hover]:bg-gray-500 [&::-webkit-scrollbar-track]:bg-transparent dark:[scrollbar-color:#6b7280_transparent] dark:[&::-webkit-scrollbar-thumb]:bg-gray-500 dark:[&::-webkit-scrollbar-thumb:hover]:bg-gray-400">
<table className="w-full min-w-max text-sm">
<thead className="sticky top-0 z-10 bg-gray-800 text-xs tracking-wide text-gray-100 shadow-sm dark:bg-gray-950">
<tr>
@ -730,7 +730,7 @@ const Assistant = () => {
)}
</div>
<div
className={`max-w-[80%] min-w-0 rounded-lg p-2 ${msg.role === 'user' ? 'bg-blue-500 text-white' : 'bg-white text-gray-800 dark:bg-gray-800 dark:text-gray-100'}`}
className={`max-w-[90%] min-w-0 rounded-lg p-2 ${msg.role === 'user' ? 'bg-blue-500 text-white' : 'bg-white text-gray-800 dark:bg-gray-800 dark:text-gray-100'}`}
>
<div className="flex flex-col gap-1">
{renderMessageContent(msg)}