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

Offline Kony

  • Plnoletý
  • ***
  • Příspěvků: 125
  • 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ů: 1700
  • Karma: 70
    • 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

  • Plnoletý
  • ***
  • Příspěvků: 125
  • 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: 29
    • 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

  • Plnoletý
  • ***
  • Příspěvků: 125
  • 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: 29
    • 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

  • Plnoletý
  • ***
  • Příspěvků: 125
  • 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: 29
    • 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

  • Plnoletý
  • ***
  • Příspěvků: 125
  • 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: 29
    • 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

  • Plnoletý
  • ***
  • Příspěvků: 125
  • 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: 29
    • 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

  • Plnoletý
  • ***
  • Příspěvků: 125
  • 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: 29
    • 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

  • Plnoletý
  • ***
  • Příspěvků: 125
  • 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 »

Offline TLama

  • Guru
  • *****
  • Příspěvků: 597
  • Karma: 29
    • Verze Delphi: 7, 2009, XE3
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #15 kdy: 09-03-2014, 14:44:17 »
tak jsem to udelal, ale tedka zase hlasi ze
Kód: [Vybrat]
'' is not a valid integer value

To mají asi pravdu ;D Prázdný řetězec opravdu nepatří mezi číselné hodnoty. Těžko ale říct kde. To ví strejda debugger. Zkontroluj všechny místa, kde se castuje string na integer. Možná ti někde zůstal prázdný edit box, nevím... Z kódu, který uvádíš to může být Edit2, Edit3 nebo po úpravě řetězce hodnota pole datum_expirace.
« Poslední změna: 09-03-2014, 15:01:41 od TLama »

Offline Kony

  • Plnoletý
  • ***
  • Příspěvků: 125
  • Karma: 1
    • Verze Delphi: Delphi 7
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #16 kdy: 16-03-2014, 09:28:36 »
v tomto je chyba..... jakmile zakomentuju tak vse jede, teda bez ćhyb, jen ze to nefiltruje


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;

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 2651
  • Karma: 25
    • Verze Delphi: XE7 professional
Re:DBGrid jeden zaznam do druhyho a odstraneni -
« Odpověď #17 kdy: 16-03-2014, 09:55:22 »
Najprv si otestuj, či tam máš platné hodnoty. Napr.
Kód: [Vybrat]
  if DataSet.FieldByName('datum_prevod').Isnull then

  if Edit3.Text = '' then // za predpokladu, že tam môžu byť len číslice. Ináč ďalší test

a zariaď sa podľa toho.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):