Autor Téma: DBGrid jeden zaznam do druhyho a odstraneni -  (Přečteno 17443 krát)

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 1
    • Verze Delphi: Delphi 7
DBGrid jeden zaznam do druhyho a odstraneni -
« kdy: 09-03-2014, 11:36:53 »
Ahoj.. mam SQL v DBGridu.....  sloupec datum_expirace a sloupec datum....

datum expirace ma tvar 2014-01-30 a sloupec datum je prazdny.... potrebuju aby se do sloupce datum prevedl text na format 20140130

zkousim to takto

Kód: [Vybrat]
procedure TForm1.ZTable1CalcFields(DataSet: TDataSet);
begin
  ZTable1.FieldByName('datum_prevod').AsString := StringReplace(ZTable1.FieldByName('datum_expirace', '-', '', [rfReplaceAll]);
end;

ale to me teda nebere :))) ze to ma moc parametru


zkousim i tohle

Kód: [Vybrat]
ZTable1.FieldByName('datum_prevod').AsString := StringReplace((ZTable1.FieldByName('datum_expirace')), '-', '', [rfReplaceAll]);
ale tady zase pise chybu Nekompatibilni typ String
« Poslední změna: 09-03-2014, 12:50:12 od Kony »

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 3506
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #1 kdy: 09-03-2014, 13:01:09 »
Kód: [Vybrat]
ZTable1.FieldByName('datum_prevod').AsString := StringReplace((ZTable1.FieldByName('datum_expirace')), '-', '', [rfReplaceAll]);ale tady zase pise chybu Nekompatibilni typ String
Misto zkouseni zkust trochu premyslet (jaka je navratova hodnota z FieldByName('xxx') a srovnej levou a pravou stranu u prirazovaciho prikazu)

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #2 kdy: 09-03-2014, 13:01:55 »
vyreseno....

Kód: [Vybrat]
a := ZTable1.FieldByName('datum_expirace').AsString ;
a := StringReplace(a, '-', '', [rfReplaceAll]);
ZTable1.FieldByName('datum_prevod').AsString := a;


Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #3 kdy: 09-03-2014, 13:03:07 »
Byl jsi blízko. Jen ti chybělo ve vstupním parametru pro StringReplace uzavřít závorku a přistoupit k hodnotě. Chyba povídající o více parametrech byla způsobena tím, že se v parametru funkce FieldByName očekává parametr jeden, a to název sloupce; no a tím, že jsi závorku neuzavřel, považoval všechno co následuje parser kompilátoru za další parametry.

Zkus tohle:

Kód: Delphi [Vybrat]
  1. procedure TForm1.ZTable1CalcFields(DataSet: TDataSet);
  2. begin
  3.   ZTable1.FieldByName('datum_prevod').AsString :=
  4.     StringReplace(ZTable1.FieldByName('datum_expirace').AsString, '-', '', [rfReplaceAll]);
  5. end;

P.S. tohle je spíš otázka pro Delphi fórum než MySQL...
« Poslední změna: 09-03-2014, 13:05:59 od TLama »

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #4 kdy: 09-03-2014, 13:40:13 »
no jeste resim jeden filtr

a to

mam Edit3.text cislo ktery se pocita podle tohoto

Kód: [Vybrat]
Edit3.Text := IntToStr(14+StrToInt(Edit2.Text));
potom mam v dbgrid sloupec ktery ma danou hodnotu

a otazka :

jak udelat to ze pokud je ve sloupci "datum_prevod" mensi cislo jak v Edit3.text tak aby se zapl filtr na ZTable1 a byli vypsany radky jen s cislama ktery jsou mensi nez je v Edit3

ted to zkousim takto :

Kód: [Vybrat]
   
if ZTable1.FieldByName('datum_prevod').AsString < Edit3.Text then
   ZTable1.Filter:='datum_prevod =';
   ZTable1.Filtered := True;

Ale tohle nefunguje

ale kdyz na to koukam tak je to logincky.. protoze tam neni vlastne danej jakej filtr se ma pouzit
« Poslední změna: 09-03-2014, 13:44:25 od Kony »

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #5 kdy: 09-03-2014, 13:51:22 »
Kód: Delphi [Vybrat]
  1. ZTable1.Filter := 'datum_prevod < ' + Edit3.Text;
  2. ZTable1.Filtered := True;

?

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #6 kdy: 09-03-2014, 13:54:22 »
ee.... to nic nedela

Pokud dam tohle :

Kód: Delphi [Vybrat]
  1. procedure TForm1.Button2Click(Sender: TObject);
  2. begin
  3. //  InttoStr(Edit3.Text) := StrtoInt(Edit2.Text)+StrtoInt('14');
  4.      Edit3.Text := IntToStr(14+StrToInt(Edit2.Text));
  5.      ZTable1.Filter := 'datum_prevod < ' + Edit3.Text;
  6.      ZTable1.Filtered := True;
  7. end;

tak to skonci s chybou :

Column with index -1 is not accessable
« Poslední změna: 09-03-2014, 13:56:16 od Kony »

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #7 kdy: 09-03-2014, 14:07:07 »
Jo počkat, on je ten sloupec s názvem datum_prevod kalkulovanej, že jo ?
« Poslední změna: 09-03-2014, 14:16:38 od TLama »

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #8 kdy: 09-03-2014, 14:12:57 »
ano presne tak

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #9 kdy: 09-03-2014, 14:16:46 »
Tak to na něj Filter property použít nepůjde. Zkus filtrovat v události OnFilterRecord datasetu. Tam bys měl mít přístup k počítanému sloupci a mohl bys pak napsat něco takového (nemám teď kde otestovat):

Kód: Delphi [Vybrat]
  1. procedure TForm1.ZTable1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
  2. begin
  3.   Accept := DataSet.FieldByName('datum_prevod').AsInteger < StrToInt(Edit3.Text);
  4. end;

Ale... Tohle castování tam a zpět je dost riskantní a zbytečně zdržuje. Doporučoval bych změnit typ toho sloupce na číselný a při kalkulaci do něj vkládat hodnoty přes:

Kód: Delphi [Vybrat]
  1. procedure TForm1.ZTable1CalcFields(DataSet: TDataSet);
  2. begin
  3.   ZTable1.FieldByName('datum_prevod').AsInteger :=
  4.     StrToInt(StringReplace(ZTable1.FieldByName('datum_expirace').AsString, '-', '', [rfReplaceAll]));
  5. end;

Taky by neuškodilo zaměnit edit box za TSpinEdit, který se používá k zadávání a zobrazování číselných hodnot a místo castování textu edit boxu přistupovat k spin edit property Value, která je typu integer.
« Poslední změna: 09-03-2014, 14:20:41 od TLama »

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #10 kdy: 09-03-2014, 14:26:13 »
pouzil jsem

Kód: Delphi [Vybrat]
  1. procedure TForm1.ZTable1CalcFields(DataSet: TDataSet);
  2. begin
  3.  ZTable1.FieldByName('datum_prevod').AsInteger :=
  4.  StrToInt(StringReplace(ZTable1.FieldByName('datum_expirace').AsString, '-', '', [rfReplaceAll]));
  5. end;

a potom na filtr

Kód: Delphi [Vybrat]
  1. procedure TForm1.Button2Click(Sender: TObject);
  2.   begin
  3.     Edit3.Text := IntToStr(14+StrToInt(Edit2.Text));
  4.     ZTable1.Filter := 'datum_prevod <' + Edit3.Text;
  5.     ZTable1.Filtered := True;
  6.   end;


ale porad ta sama hlaska

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #11 kdy: 09-03-2014, 14:31:43 »
Tak to na něj Filter property použít nepůjde. Zkus filtrovat v události OnFilterRecord datasetu. Tam bys měl mít přístup k počítanému sloupci a mohl bys pak napsat něco takového (nemám teď kde otestovat):

Kód: Delphi [Vybrat]
  1. procedure TForm1.ZTable1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
  2. begin
  3.   Accept := DataSet.FieldByName('datum_prevod').AsInteger < StrToInt(Edit3.Text);
  4. end;

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #12 kdy: 09-03-2014, 14:34:39 »
no a kdyz tohle dam... tak jak potom tento filtr aktivuju ????

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 31
    • Verze Delphi: 7, 2009, XE3
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #13 kdy: 09-03-2014, 14:37:15 »
Nastavíš Filtered propery na True ::) Samozřejmě musíš vyčistit property Filter...

Viz. help který jsem přilinkoval:

Citace
OnFilterRecord

Occurs each time a different record in the dataset becomes the active record and filtering is enabled.
...
Filtering is enabled if the Filtered property is true.
« Poslední změna: 09-03-2014, 14:39:27 od TLama »

Offline Kony

  • Hrdina
  • ****
  • Příspěvků: 368
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #14 kdy: 09-03-2014, 14:41:10 »
tak jsem to udelal, ale tedka zase hlasi ze

Kód: [Vybrat]
'' is not a valid integer value

a mam teda tohle :

Kód: Delphi [Vybrat]
  1. procedure TForm1.ZTable1FilterRecord(DataSet: TDataSet;
  2.   var Accept: Boolean);
  3. begin
  4.   Accept := DataSet.FieldByName('datum_prevod').AsInteger < StrToInt(Edit3.Text);
  5. end;

Kód: Delphi [Vybrat]
  1. procedure TForm1.Button2Click(Sender: TObject);
  2.   begin
  3.     Edit3.Text := IntToStr(SpinEdit1.Value+StrToInt(Edit2.Text));
  4.     //ZTable1.Filter := 'datum_prevod <' + Edit3.Text;
  5.     ZTable1.Filtered := True;
  6.   end;

Kód: Delphi [Vybrat]
  1. procedure TForm1.ZTable1CalcFields(DataSet: TDataSet);
  2.  var
  3.   a : string;
  4.   begin
  5.        ZTable1.FieldByName('datum_prevod').AsInteger := StrToInt(StringReplace(ZTable1.FieldByName('datum_expirace').AsString, '-', '', [rfReplaceAll]));
  6.        datum := a ;
  7.   end;
« Poslední změna: 09-03-2014, 14:43:04 od Kony »