Forum Delphi.cz

Databáze => MySQL => Téma založeno: Kony 09-03-2014, 11:36:53

Název: DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: Kony 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
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: pf1957 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)
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: Kony 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;

Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: TLama 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...
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: Kony 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
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: TLama 09-03-2014, 13:51:22
Kód: Delphi [Vybrat]
  1. ZTable1.Filter := 'datum_prevod < ' + Edit3.Text;
  2. ZTable1.Filtered := True;

?
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: Kony 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
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: TLama 09-03-2014, 14:07:07
Jo počkat, on je ten sloupec s názvem datum_prevod kalkulovanej, že jo ?
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: Kony 09-03-2014, 14:12:57
ano presne tak
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: TLama 09-03-2014, 14:16:46
Tak to na něj Filter property použít nepůjde. Zkus filtrovat v události OnFilterRecord (http://docwiki.embarcadero.com/Libraries/XE5/en/Data.DB.TDataSet.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.
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: Kony 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
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: TLama 09-03-2014, 14:31:43
Tak to na něj Filter property použít nepůjde. Zkus filtrovat v události OnFilterRecord (http://docwiki.embarcadero.com/Libraries/XE5/en/Data.DB.TDataSet.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;
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: Kony 09-03-2014, 14:34:39
no a kdyz tohle dam... tak jak potom tento filtr aktivuju ????
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: TLama 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.
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: Kony 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;
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: TLama 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.
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: Kony 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;
Název: Re:DBGrid jeden zaznam do druhyho a odstraneni -
Přispěvatel: Stanislav Hruška 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.