View Full Version : یافتن مقادیر تکراری از بانک
hassan1365
سه شنبه 29 فروردین 1385, 10:36 صبح
سلام
میخوام فیلدهایی رو که مقادیر یکسان دارن رو از یه جدول SELECT کنم.ولی عبارتش رو نمیدونم.
ممنون میشم اگه کمک کنین.
موفق باشید.
mzjahromi
سه شنبه 29 فروردین 1385, 15:39 عصر
میخوام فیلدهایی رو که مقادیر یکسان دارن رو از یه جدول SELECT کنم.ولی عبارتش رو نمیدونم.
اگر منظورتون از فیلدها همون رکورد ها هست
Select FiledName,Count(*)
From Tablename
group by FieldName
having count(*)>1
البته اگه جستجو بکنی نمونه این سوال زیاد مطرح شده.
hassan1365
سه شنبه 29 فروردین 1385, 21:09 عصر
سلام
بابت تکراری بودن سوال ببخشید.
بله منظورم رکورد بود.بازم ببخشید.
این عبارت تعداد رو برمیگردونه.
میخوام تمام رکوردهایی که یه فیلد یکسان دارن برگردن.
موفق باشید.
mzjahromi
چهارشنبه 30 فروردین 1385, 06:44 صبح
یعنی این؟
Select * From TableName Where FieldName In(
Select FiledName
From Tablename
group by FieldName
having count(*)>1)
hassan1365
چهارشنبه 30 فروردین 1385, 10:06 صبح
سلام
تست میکنم جوابشو میدم.
موفق باشید.
hassan1365
چهارشنبه 30 فروردین 1385, 21:30 عصر
سلام
اولا مرسی.
آدم وقتی دستش میاد تو کار یه چیزای جدیدی کشف میکنه و یه سوالای جدیدی براش مطرح میشه که شاید اصلا فکرش هم نمیکنه.
وقتی میخوام از بانک پاک کنم آخرین رکورد پاک میشه نه رکورد انتخابی کاربر تو گراید.نمیدونم چرا ولی اگه دوستان کمک کنن ممنون میشم.
از وقتی ویندوزم رو عوض کردم تمام RighttoLeft ها برعکس شدن و جالب اینکه خاصیت BIDI همشون روی RighttoLeft تنظیم شده فقط کار نمیکنه.اینم نمیدونم چرا.
بعدی اینکه کدی رو که شما گفتین درسته ولی میخوام مثلا اگر دو رکورد (یا بیشتر) مقادیر یکسان در فیلدهای (اولا) روز و (ثانیا) ساعت داشتن بییان.مثلا 1385/01/13 ساعتهای 10:10 و 10:15 باهم بییان و 1385/01/25 ساعتهای 02:02 و 02:00 با هم بییان.باز اینم نمیدونم چطوریه.
(این خوب همش شد نمیدونم!!!)
موفق باشید.
JavanSoft
پنج شنبه 31 فروردین 1385, 12:39 عصر
همان جواب رو برای فیلدهای با طول ثابت تعمیم دهید و در مورد فیلدهای عددی از Convert استفاده کنید و در مورد ساعتهای یکسان از SubString
Select * From TableName Where FieldName In(
Select FiledName+FiledName1+...
From Tablename
group by FieldName
having count(*)>1)
hassan1365
شنبه 02 اردیبهشت 1385, 21:26 عصر
سلام
تست میکنم جواب میدم.
موفق باشید.
hassan1365
سه شنبه 05 اردیبهشت 1385, 13:17 عصر
سلام
از کد شما این خطا رو میگیره:
COLUMN 'ALAKI2.EV_TIME' IS INVALID IN THE SELECT LIST BECOUSE IT IS NOT
CONTAINED IN EITHER AN AGGREGATE FUNCTION OR THE GROUP BY CLAUSE.
اینم کد منه:
SELECT * FROM ALAKI2 WHERE EV_DATE IN(
SELECT EV_DATE+ EV_TIME FROM ALAKI2
GROUP BY EV_DATE
HAVING COUNT(*)>1)
این کد رو هم برای درصدگیری نوشتم ولی برای اولین بار اجرا میشه ولی وقتی یه رکورد رو تغییر میدی و بعد دکمه رو میزنی دو باره به حالت اول بر میگرده.
procedure TForm1.Button1Click(Sender: TObject);
begin
ADOQuery1.Close;
ADOQuery1.SQL.Text :='SELECT * FROM ALAKI2 WHERE EV_ANJAM_TIK=1';
ADOQuery1.Open;
COUNT1:=ADOQuery1.RecordCount;
PERCENT:=COUNT1*100;
ADOQuery1.Close;
ADOQuery1.SQL.Text :='SELECT * FROM ALAKI2';
ADOQuery1.Open;
COUNT2:=ADOQuery1.RecordCount;
wwDBGrid1.Refresh;
A:=PERCENT DIV COUNT2;
IF A<>0 THEN
ShowMessage(IntToStr(A)+' %')
ELSE
ShowMessage('0 %');
END;
تداخل رو هم اینطوری نوشتم(به دو صورت) ولی درست کار نمیکنه.
نظر دوستان چیه؟
SUM:=0;
//BEGIN OF SET FOUNDDATE,FOUNDDATE2 VALUES
ADOQuery1.Close;
ADOQuery1.SQL.Text :='SELECT * FROM ALAKI2 WHERE EV_DATE IN(SELECT EV_DATE FROM ALAKI2 GROUP BY EV_DATE HAVING COUNT(*)>1)';
ADOQuery1.Open;
WHILE NOT ADOQuery1.Eof DO
BEGIN
FOUNDDATE:=ADOQuery1.FIELDBYNAME('EV_DATE').AsStri ng;
ADOQuery1.Next;
IF ADOQuery1.FieldByName('EV_DATE').AsString =FOUNDDATE THEN
FOUNDDATE2:=ADOQuery1.FieldByName('EV_DATE').AsStr ing;
END;
// END OF SET FOUNDDATE , FOUNDDATE2 VALUES.
// BEGIN OF SET FOUNDTIME VALUE
ADOQuery1.First;
WHILE NOT ADOQuery1.Eof DO
BEGIN
A: FOUNDTIME :=COPY(ADOQuery1.FIELDBYNAME('EV_TIME').AsString,1 ,2);
ADOQuery1.Next;
// END OF SET FOUNDTIME VALUE
// BEGIN OF CHECK FOUNDDATE AND FOUNDTIME VALUES
// IF FOUNDTIME EQUAL TO FOUNDDATE ====> SUM=SUM+1
IF COPY(ADOQuery1.FIELDBYNAME('EV_TIME').AsString,1,2 )=FOUNDTIME THEN
BEGIN
ShowMessage('TRUE');
ADOQuery2.Close;
ADOQuery2.SQL.Text:='SELECT * FROM ALAKI2 WHERE EV_TIME IN(SELECT EV_TIME FROM ALAKI2 GROUP BY EV_TIME HAVING COUNT(*)>1)';
ADOQuery2.Open;
WHILE NOT ADOQuery2.Eof DO
IF (FOUNDDATE =COPY(ADOQuery1.FIELDBYNAME('EV_TIME').AsString,1, 2)) OR (FOUNDDATE2 =COPY(ADOQuery1.FIELDBYNAME('EV_TIME').AsString,1, 2)) THEN
BEGIN
SUM:=SUM+1;
ADOQuery2.Next;
GOTO A;
END
ELSE
ADOQuery2.Next;
END;
ADOQuery1.Next;
END;
ShowMessage(IntToStr(SUM));
و
I:=1;
SUM:=0;
QRDATE.Close;
QRDATE.SQL.Text:='SELECT * FROM ALAKI2 WHERE EV_DATE IN(SELECT EV_DATE FROM ALAKI2 GROUP BY EV_DATE HAVING COUNT(*)>1)';
QRDATE.Open;
DATE[0]:=QRDATE.FIELDBYNAME('EV_DATE').AsString;
QRDATE.Next;
WHILE NOT QRDATE.Eof DO
BEGIN
IF QRDATE.FIELDBYNAME('EV_DATE').AsString <> DATE[I-1] THEN
BEGIN
DATE[I]:=QRDATE.FIELDBYNAME('EV_DATE').AsString;
I:=I+1;
QRDATE.Next;
END;
END;
QRTIME.Close;
QRTIME.SQL.Text:='SELECT * FROM ALAKI2 WHERE EV_TIME IN(SELECT EV_TIME FROM ALAKI2 GROUP BY EV_TIME HAVING COUNT(*)>1)';
QRTIME.Open;
I:=1;
WHILE NOT QRTIME.Eof DO
BEGIN
IF DATE[I]=QRTIME.FieldByName('EV_DATE').AsString THEN
SUM:=SUM+1;
I:=I+1;
QRTIME.Next;
END;
//ShowMessage(INTTOSTR(SUM));
موفق باشید.
hassan1365
پنج شنبه 07 اردیبهشت 1385, 07:28 صبح
سلام
تداخل رو نوشتم فقط طریقه استفاده از substring رو نمیدونم.
میشه اونو با یه مثال توضیح بدین.
میخوام رکوردهایی رو که شامل فیلدهایی هستند که دو حرف اولشون تکراری است رو select کنم.
موفق باشید.
JavanSoft
پنج شنبه 07 اردیبهشت 1385, 15:46 عصر
SubString (رشته,شروع ,طول)
hassan1365
پنج شنبه 07 اردیبهشت 1385, 19:07 عصر
سلام
مشکلات قبلی رو برطرف کردم .فقط مونده چندتاش(!!!)
ممنون میشم دوستان راهنمایی کنن.
این کد رو برای تداخل زمانی نوشتم.
دو تا ADOQUERY داریم که یکی برای تاریخها و یکی برای ساعتهای تکراری استفاده میشه.
WHILE NOT QRDATE.Eof DO
WHILE NOT QRTIME.Eof DO
IF COPY(QRDATE.FieldByName('EV_TIME').AsString,1,2)=C OPY(QRTIME.FieldByName('EV_TIME').AsString,1,2) THEN
BEGIN
SUM:=SUM+1;
QRTIME.Next;
END
ELSE
BEGIN
QRTIME.First;
QRDATE.Next;
END;
ShowMessage(INTTOSTR(SUM));
منتها کار نمیکنه.اشکال از یکی از while هاست.
دوم اینکه برای اضافه کردن عکس به بانک این کد فیلد خالی اضافه میکنه در صورتی که باید عکس انتخاب شده در یک dbimage رو اضافه کنه:
ADOQuery1.Insert;
ADOQuery1IMG.Value :=DBImage1.DataField;
ADOQuery1IMG.LoadFromFile(DBImage1.DataField);
ADOQuery1.Post;
این درصد گیری هم کار نمیکنه:
ADOQuery1.Close;
ADOQuery1.SQL.Text :='SELECT * FROM ALAKI2 WHERE EV_ANJAM_TIK=1';
ADOQuery1.Open;
COUNT1:=ADOQuery1.RecordCount;
PERCENT:=COUNT1*100;
ADOQuery1.Close;
ADOQuery1.SQL.Text :='SELECT * FROM ALAKI2';
ADOQuery1.Open;
COUNT2:=ADOQuery1.RecordCount;
wwDBGrid1.Refresh;
A:=PERCENT DIV COUNT2;
IF A<>0 THEN
ShowMessage(IntToStr(A)+' %')
ELSE
ShowMessage('0 %');
این باتون هم فقط برای 1 رکورد در هر صفحه عمل میکنه و وقتی رکورد بعدی رو انتخاب و سپس باتون رو میزنیم دوباره همون اولی انتخاب میشه که این اشتباس:
CMB_MIN_EDIT.ItemIndex:=CMB_MIN_EDIT.Items.IndexOf (COPY(QREVENTS.FIELDBYNAME('EVENT_WATCH').Value,4, 2));
بعدی وقتی که wwgride رو عقب جلو میکنی (براساس یه فیلد مثل ID) آخرین رکورد آورده شده select شده ولی باید اولین ردیف از خودش یا حداقل اون ردیفی رو که من میگم انتخاب کرده باشه.
از این که نظر میدین و کمک میکنین واقعا ممنونم.
موفق باشید.
hassan1365
دوشنبه 11 اردیبهشت 1385, 06:53 صبح
سلام
دوستان خسته نباشید.ممنونم.
موفق باشید.
hassan1365
دوشنبه 18 اردیبهشت 1385, 07:03 صبح
سلام
تموم کار ها رو کردم فقط چندتا...
میخوام در زمان لودینگ یا با یه باتون یه سطر خاص از wwgride انتخاب بشه(select بشه) مثلا سطر پنجم انتخاب بشه.(فقط انتخاب)
یه فیلد دارم که از نوع bit هستش و در wwgride از نوع checkbox هستش.ولی وقتی که کاربر تیک میزنه در بانک ذخیره نمیشه و پس از عقب و جلو کردن و یا رفرش کردن دوباره به حالت اول برمیگرده.
وقتی هم که یه رکورد رو edit میکنم اطلاعات آخرین رکورد موجود در query یا همون wwgride می آد نه اونکه کاربر select کرده .وقتی هم که برای بار دوم میزند همان اطلاعات قبلی رو می آورد و بقیه رکوردها رو نمی آورد.(اصلا کاری به انتخاب کاربر نداره هر کاری که خودش میخواد میکنه)
دوستان اگه نظرشون رو بگن ممنون میشم.
موفق باشید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.