PDA

View Full Version : کوئری برای پیدا کردن ردیف جا افتاده



moustafa
یک شنبه 28 آبان 1385, 00:39 صبح
کوئری برای پیدا کردن ردیف جا افتاده از نوع غیر "اتو نامبر " چطوری ساخته میشه مثلا
ردیف
1
2
3
5
6
7
8
10
کوئری برای پیدا کردن :
ردیف
4
9

با تشکر

محمد دادودنیا
یک شنبه 28 آبان 1385, 01:30 صبح
یا پروسیجر حل میشه ولی با Query ؟

moustafa
یک شنبه 28 آبان 1385, 10:19 صبح
روش مهم نیست فقط اونی رو که می خوام بده

arshia_
یک شنبه 28 آبان 1385, 12:09 عصر
می تونی یه روش ساده استفاده کنی
اول برحسب autonumber مرتب کنی
بعد به حلقه بذاری که مقدار حلقه با مقدار autonumber مقایسه بشه
هرجا مساوی نباشه یعنی جاافتاده
هر وقت مقدار جاافتاده ای بود برنامه بانک رو به جای next کردن نگه داره تا مقدار بعدی جا افتاده اونقدر تکرار بشه تا برسه ب مقادیر مساوی بعدی
روش جالبی نیست ولی جواب می ده
مثلا
for i:=0 to maxnumberofbanck do
begin
if i=fielddata then tabel.next
else
lostnumber[i]:=i
end;
که این فقط یه شبهه کد است
اگر توسنتی استفاده کنی که هیچ
اگر نشد بگو تا کد واقعی برات بنویسم

aliila
یک شنبه 28 آبان 1385, 12:31 عصر
Public Function first_blanck_key1(ByVal table As String, ByVal fields As String, ByRef gnConnect As SqlConnection) As DataSet
Dim SqlCommand1 As New SqlCommand
Dim dataset1 As New DataSet
Dim SqlDataAdapter1 As New SqlDataAdapter
Dim s As String
Dim view1, view2 As String
view1 = "##ali_view"
view2 = "##ali"
SqlCommand1.Connection = gnConnect
Try
s = " select * into " + view1 + " from " + table & vbCrLf & _
"SELECT (SELECT COUNT(*) " & vbCrLf & _
" FROM " + view1 + " e1 " & vbCrLf & _
" WHERE e1." + fields + " <= e2." + fields + ") AS [ردیف ثبت] , e2.*" & vbCrLf & _
" into " + view2 + " " & vbCrLf & _
" FROM " + view1 + " e2 " & vbCrLf & _
" drop table " + view1 + " " & vbCrLf & _
" select e2.* , isnull(a1." + fields + ",9999999) as [تا] " & vbCrLf & _
" from " + view2 + " e2 left outer join " + view2 + " a1 " & vbCrLf & _
" on a1.[ردیف ثبت]-e2.[ردیف ثبت]= 1 where isnull( a1." + fields + "-e2." + fields + " ,0)<> 1 " & vbCrLf & _
" drop table " + view2 + " "

SqlCommand1.CommandText = s
SqlDataAdapter1.SelectCommand = SqlCommand1
dataset1.Clear()
SqlDataAdapter1.Fill(dataset1)
Catch ex As Exception
MsgBox(s & vbCrLf & ex.Message)

End Try
Return dataset1
End Function

aliila
یک شنبه 28 آبان 1385, 12:45 عصر
s = " select * into " + view1 + " from " + table & vbCrLf & _
"SELECT (SELECT COUNT(*) " & vbCrLf & _
" FROM " + view1 + " e1 " & vbCrLf & _
" WHERE e1." + fields + " <= e2." + fields + ") AS [ردیف ثبت] , e2.*" & vbCrLf & _
" into " + view2 + " " & vbCrLf & _
" FROM " + view1 + " e2 " & vbCrLf & _
" drop table " + view1 + " " & vbCrLf & _
" select e2.* , isnull(a1." + fields + ",9999999) as [تا] " & vbCrLf & _
" from " + view2 + " e2 left outer join " + view2 + " a1 " & vbCrLf & _
" on a1.[ردیف ثبت]-e2.[ردیف ثبت]= 1 where isnull( a1." + fields + "-e2." + fields + " ,0)<> 1 " & vbCrLf & _
" drop table " + view2 + " "

moustafa
یک شنبه 28 آبان 1385, 15:05 عصر
با استفاده از فرم

Private Sub Form_Open(Cancel As Integer)
daftarid.SetFocus
DoCmd.RunCommand acCmdSortAscending
For I = 2 To DCount("*", "[rdif]")
DoCmd.GoToRecord acDataForm, "row", acGoTo, I


n11 = daftarid
DoCmd.GoToRecord acDataForm, "row", acGoTo, I - 1
m11 = daftarid
p11 = n11 - m11
DoCmd.GoToRecord acDataForm, "row", acGoTo, I
RowNum = p11
Next I
DoCmd.ApplyFilter , "RowNum <>1"
End Sub

moustafa
یک شنبه 28 آبان 1385, 15:21 عصر
می تونی یه روش ساده استفاده کنی
اول برحسب autonumber مرتب کنی
بعد به حلقه بذاری که مقدار حلقه با مقدار autonumber مقایسه بشه
هرجا مساوی نباشه یعنی جاافتاده
هر وقت مقدار جاافتاده ای بود برنامه بانک رو به جای next کردن نگه داره تا مقدار بعدی جا افتاده اونقدر تکرار بشه تا برسه ب مقادیر مساوی بعدی
روش جالبی نیست ولی جواب می ده
مثلا
for i:=0 to maxnumberofbanck do
begin
if i=fielddata then tabel.next
else
lostnumber[i]:=i
end;
که این فقط یه شبهه کد است
اگر توسنتی استفاده کنی که هیچ
اگر نشد بگو تا کد واقعی برات بنویسم
ممنون دوست عزیز ،دستورات شما در دلفی ء من با وی بی آ می خوام یا کوئری های خود اکسس البته یه روش در پائین گذاشتم مشکل سرعت داره
روش اتو نامبر هم چون نقطه شروع یکی نیست یا به هنگام حذف یه رکورد ..... زیاد مناسب نیست

karmand
دوشنبه 29 آبان 1385, 12:00 عصر
راهی که من انتخاب کردم چون مرتبا باید کنترل شود به این صورت بود
یک تیبل ساخته بودم کمکی با دو فیلد و در یک فیلد ان 5000 رکورد که در ان از 1 تا 5000 بود
این تیبل و تیبل اصلی را در یک کواریupdate اورده ام فیلد مشترک را وصل کردم و مشترکها رادر فیلد دوم تیبل کمکی تیک میزنم و بعد انهایی که تیک نخرده را نمایش میدهم

mzjahromi
دوشنبه 29 آبان 1385, 12:14 عصر
کوئری برای پیدا کردن ردیف جا افتاده از نوع غیر "اتو نامبر " چطوری ساخته میشه مثلا
این یا یه چیزی شبیه به این کارت رو راه میاندازه


ُ Select Row+1
From TableName as T
Where Not Row+1 in(Select Row From TableName Where Row=T.Row+1)

karmand
دوشنبه 29 آبان 1385, 12:47 عصر
دستور شما را در یک کواری کپی کردم زمان اجرا آن را تغیر داد به این صورت
SELECT Row+1 AS Expr1
FROM Table1 AS T
WHERE ((([Row]+1) Not In (Select Row From Table1 Where Row=T.Row+1)));
ولی میشود به نتیجه رسید

dadsara
چهارشنبه 29 خرداد 1387, 10:44 صبح
باسلام
دوست عزیز جناب Mzjahromi کد فوق تنها در صورتی کار می کنه که بین هر رکورد با رکورد بعدی فقط یک شماره جا افتاده باشد

dadsara
سه شنبه 04 تیر 1387, 07:55 صبح
سلام خدمت همه دوستان
اگر کسی بتواند اینجانب را درخصوص آخرین سوال راهنمائی کند متشکر می شوم

dadsara
پنج شنبه 06 تیر 1387, 11:55 صبح
سلام به همگی
یکی هم لطف کنه اگر وقت داره به ما جواب بده

dadsara
شنبه 15 تیر 1387, 09:27 صبح
باسلام خدمت همه دوستان
اگر کسی به راه حلی دست پیدا کرده لطفا جواب بده

dadsara
دوشنبه 17 تیر 1387, 09:01 صبح
سلام به همگی
- من این سوالم را خیلی وقت است مطرح کرده ام ولی کسی به آن جواب نمی دهد می خواهم بدانم آیا اصلا روشی برای این کار وجود ندارد یا نه
- باتوجه به اینکه تعداد بازدیدکنندگان تا حالا 229 نفر بوده است احتمالا سایرین نیز با این مشکل برخورد کرده اند

davood-ahmadi
دوشنبه 17 تیر 1387, 09:17 صبح
جناب آقای/ خانم Dadsara :
میشه خودتون توضیح کاملتری بدهید که دوستان بتوانند کمک کنند.
لطفاً واضح باشه. ممنون

dadsara
دوشنبه 17 تیر 1387, 10:53 صبح
جناب davood_ahmadi از توجه جنابعالی متشکرم
یک جدول دارم یکی از فیلدهای آن شماره است و بنا به دلایلی می خواهم شماره هائی که در بین رکورد اول تا آخر وجود ندارد را پیدا کنم
روشهائی که دوستان فرمده اند را اجرا نمودم ولی تنها در صورتی کار میکند که تنها یک شماره بین آنها خالی باشد
مثلا در نمونه ضمیمه می خواهم شماره های 5،7،8،9،13،14،15،17،18،19 باید برگردانده شود
- ضمنا باتوجه به اینکه آخرین شماره متغیر هست می خواهم و بصورت اتوماتیک اعداد تا بزرگترین شماره کنترل شود .

karmand
دوشنبه 17 تیر 1387, 12:53 عصر
جناب mzjahromi باتشکر از کوار
اما فقط برایردیفهایی که یک اختلاف دارد کارایی دارد وقتییک و یا بیش از یک با نمایش نمیدهد میتوانید آن را اصلاح شود

davood-ahmadi
دوشنبه 17 تیر 1387, 14:19 عصر
جناب آقای/ خانم Dadsara :
نمونه شما آماده است. فکر کنم فهمیدنش از روی کدها براتون راحت باشه.

dadsara
دوشنبه 17 تیر 1387, 14:34 عصر
جناب Davood-ahmadi واقعا از جنابعالی متشکرم
اما سوال
1- من این تکه کد را متوجه نشدم اگر امکان داره توضیح دهید

For IdCounter = IdMin To IdMax
Set Rst = Db.OpenRecordset("select id from table1 where id=" & IdCounter)
If Rst.RecordCount > 0 Then
Else
Me.List3.AddItem IdCounter
End If
Next
2- آیا می شود اطلاعات موجود در لیست را ذخیره نمود. و یا در یک ریپورت چاپ کرد
3- آیا می شود همین کار را با تاریخ انجام داد

davood-ahmadi
دوشنبه 17 تیر 1387, 15:09 عصر
گفتم که در حالت چرخشی از کمترین عدد تا بیشترین عدد
کمترین عدد را در IdCounter می ریزد
سپس به بانک نگاهی می کند تا ببیند همچین عددی هست یا نه. اگر نبود در لیست باکس عددی که نیست را اضافه می کند و اگر بود به سراغ عدد بعدی می رود و همین کار را تا عدد آخر تکرار می کند.
در ضمن این اعداد را می توانید به یک جدول بفرستید و سپس از آن استفاده کنید و یا همان فرمول را در گزارش بگذارید و می توانید با کمی تغییرات آنرا به شکل یک گزارش قابل چاپ استفاده کنید.
تاریخ را هم می توان به این شکل عمل نمود و لی فقط کدهای بیشتری می خواهد.

karmand
پنج شنبه 20 تیر 1387, 07:15 صبح
جناب mzjahromiبا تشکر
این کواری فقط اگر یک شماره جا افتاده باشد نمایش میدهد فاصله بیش از یک شماره نمایش نمیدهد نمیشود آن را اصلاح فرمایید