PDA

View Full Version : خطا در محاسبه gap در پايگاه داده DBISAM ولي اجرا شدن در SQL SERVER



دنیای دلفی
دوشنبه 02 آبان 1390, 12:10 عصر
سلام

فرض كنيد يك ستون به نام number داريم كه اعداد 1 2 3 4 5 7 8 9 10 11 12 13 الي آخر

همانطور كه مي بينيد عدد 6 را نداريم يك كد SQL مي خواهم كه اين عدد را بدست آورد و به من بدهيد يعني به طور كلي يك كد منحصر به فرد بدهد كه اگر عددي بين اعداد خالي بود آن را اعلام كند . بعد از دادن 6 در گام بعدي قطعا بايد عدد 14 را بدهد و الي آخر يعني اگر كاربري ركورد 11 را پاك كرد در تراكنش بعدي بايد 11 را بدهد .

با تشكر

با ADO كار مي كنم . و SQL SERVER

یوسف زالی
سه شنبه 03 آبان 1390, 15:08 عصر
سلام.
بهتر بود در تالار T-SQL مطرح میشد . کدهای مربوط به گپ هم زیاد هست.
اجالتا برای اولین مغایرت از کد زیر می تونین استفاده کنین:
with CTE as (select row_number() over (order by number) Row, number from TBL) select Row from CTE where Row <> number

دنیای دلفی
سه شنبه 03 آبان 1390, 20:32 عصر
از كد فوق نتونستم نتيجه بگيريم اين كد رو درست كردم با تحقيق ولي مشكل داره نظرتون رو بگيد :


with QKala do
try
Close;
SQL.Clear;
SQL.Add('SELECT MissingRangeStart,MissingRangeEnd');
SQL.Add('FROM (SELECT soh1.Master+1 AS MissingRangeStart,');
SQL.Add('(SELECT min(Master) - 1');
SQL.Add('FROM HesabKol AS soh');
SQL.Add('WHERE soh.Master > soh1.Master) AS MissingRangeEnd');
SQL.Add('FROM HesabKol AS soh1');
SQL.Add('LEFT OUTER JOIN HesabKol AS soh2');
SQL.Add('ON soh1.Master = soh2.Master - 1');
SQL.Add('WHERE soh2.Master IS NULL) AS a');
SQL.Add('WHERE MissingRangeEnd IS NOT NULL');
SQL.Add('ORDER BY MissingRangeStart');

ExecSQL;
finally

// Close;
end;

یوسف زالی
چهارشنبه 04 آبان 1390, 23:16 عصر
دوست عزیز کدی که گذاشتم مشکلی نداشت.
همونطور که گفتم فقط ردیف اولش اولین رو گپ می ده.
اگر خواستید میشه توسعه اش داد.
همون ردیف اول هم اشتباه هست؟

samani
شنبه 07 آبان 1390, 17:43 عصر
Declare @t table (Number int)
Declare @i as int, @Number int

INSERT INTO @t
SELECT N FROM T
ORDER BY N

SET @Number = NULL
SET @i = 1

WHILE (@Number IS NULL) and (@@Rowcount > 0)
BEGIN
IF @i NOT IN (SELECT Number FROM @t)
SET @Number = @i
SET @i = @i + 1
END

SELECT ISNULL(@Number, @i)

دنیای دلفی
شنبه 14 آبان 1390, 09:25 صبح
سلام
اين كد خوبه و جالبه تو SQL SERVER به خوبي كار مي كنه ولي مي خواهم تو DBISAM اجراش كنم نمي شه و اين خطا رو مي ده به نظر شما دوستان مشكل از كجاست :

SELECT MIN(master)
FROM HesabKol AS T
WHERE NOT EXISTS
(SELECT *
FROM HesabKol
WHERE master = T.master + 1);


به اين شكل تو DBISAM نوشتم با استفاده از كوري خودش :

with QKala do
try
Close;
SQL.Clear;
SQL.Add('SELECT MIN(Master)');
SQL.Add('FROM HesabKol AS T');
SQL.Add('WHERE NOT EXISTS');
SQL.Add('(SELECT * FROM HesabKol WHERE Master = T.Master + 1)');
ExecSQL;
finally
end;



با تشكر

Felony
شنبه 14 آبان 1390, 09:32 صبح
به نظر میاد فاصله رو بین کاراکتر های رعایت نکردید ، تو خط 2 و 3 کد زیر رو نوشتید :

SQL.Add('FROM HesabKol AS T');
SQL.Add('WHERE NOT EXISTS');

بعد از T تو خط اول کد بالا یک فاصله بزارید تا Parser بتونه Query رو تحلیل کنه .

دنیای دلفی
شنبه 14 آبان 1390, 11:49 صبح
با تشكر

نه ارتباطي به فاصله نداره وقتي با متد SQL.Add كار مي كني خودش مشكل فاصله رو حل مي كنه .

Felony
شنبه 14 آبان 1390, 12:15 عصر
آها ؛ حواسم نبود از متد Add استفاده کردی .

دنیای دلفی
چهارشنبه 25 آبان 1390, 19:12 عصر
با عرض پوزش SPAM UP دادم دوستان به نظرتون راهي نيست اين خطا برطرف بشه .

با تشكر

دنیای دلفی
سه شنبه 15 آذر 1390, 19:09 عصر
با تشكر از دوستان حل شد مي زارم بقيه هم استفاده كنند :


with QKala do
try
Close;
SQL.Clear;

SQL.Add('SELECT CAST(T."CodeKala" AS INT) + 1 AS Start');
SQL.Add('FROM HesabKol AS T');
SQL.Add('LEFT OUTER JOIN HesabKol AS R ON CAST(T."CodeKala AS INT) + 1 = CAST(R."CodeKala" AS INT)');
SQL.Add('WHERE CAST(R."CodeKala" AS INT) IS NULL');
SQL.Add('ORDER BY Start');

ExecSQL;
finally
Result:=FieldByName('Start').AsString;
end;