Leválogatás két táblából

Leválogatás két táblából
2017-07-25T16:04:43+02:00
2017-07-26T11:54:35+02:00
2022-10-15T23:20:59+02:00
KöveZoli
Sziasztok,

Két táblába beolvasok 1-1 csv file-t, aztán megvizsgálom, hogy az egyik táblában lévő rekord megtalálható-e a másikban.
Ha nincs, akkor megy bele egy harmadik táblába, ha van és a mennyiség mezője nem egyezik meg, akkor az a rekord egy negyedik táblába kerül.
Az nem világos, hogy miért pakol bele olyan rekordot is, amelyiknél a mennyiség mezőben nincs eltérés.
A táblák egyformák. A mennyiség mező INT(11).
Segítségeteket kérném, mi lehet a gond? A sap tábla 12300 soros, a webáruházé pedig 5700 +/-

...
while not sap_tabla.Eof do
begin
if (not webaruhaz_tabla.FindKey([sap_tabla.Fields.Fields[0].Value] )) then
begin
nincs_a_weben_tabla.Insert;
nincs_a_weben_tabla.FieldByName('cikkszam').Value:=sap_tabla.FieldByName('cikkszam').Value;
nincs_a_weben_tabla.FieldByName('megnevezes').Value:=sap_tabla.FieldByName('megnevezes').Value;
nincs_a_weben_tabla.FieldByName('mennyiseg').Value:=sap_tabla.FieldByName('mennyiseg').Value;
nincs_a_weben_tabla.Post;
end;

if (webaruhaz_tabla.FindKey([sap_tabla.Fields.Fields[0].Value] )) then
begin
if sap_tabla.FieldByName('mennyiseg').Value<>webaruhaz_tabla.FieldByName('mennyiseg').Value then
begin
modosult_tabla.Insert;
modosult_tabla.FieldByName('cikkszam').Value:=sap_tabla.FieldByName('cikkszam').Value;
modosult_tabla.FieldByName('megnevezes').Value:=sap_tabla.FieldByName('megnevezes').Value;
modosult_tabla.FieldByName('mennyiseg').Value:=sap_tabla.FieldByName('mennyiseg').Value;
modosult_tabla.Post;
end;

end;

sap_tabla.Next;
end;
Mutasd a teljes hozzászólást!
Az bizony súlyos baj, ha a csv nem "comma separated", hanem pontosvessző! Ilyen disznóságot az Excel szokott csinálni. És úgy védheted ki, hogy átállítod a Windows területi beállításokat amerikaira.

Mindentől függetlenül dejavu érzésem van: nem mondtam még, hogy használd a forráskód </> gombot?  Ha nem, akkor most mondom, sokkal könnyebben olvasható lesz a beidézett kódod.

Bónusz gyorsítási javaslat: ez első if...end blokk végére pontosvessző helyett else -t írj, akkor a második if-es vizsgálat már nem is kell. Mert ugye vagy van a webáruházban olyan rekord, vagy nincs. Ez 12300 x 5700 rekord esetén már szerintem számíthat sebességben.
Mutasd a teljes hozzászólást!

  • Őőőőő, lehet, hogy nem is itt van a gond, hanem a csv-ben. ";" kontra ",".
    Van, ahol a megnevezésben van szám, de vessző a tizedes, így a mennyiség mezőbe nem jó érték kerül.
    Mutasd a teljes hozzászólást!
  • Az bizony súlyos baj, ha a csv nem "comma separated", hanem pontosvessző! Ilyen disznóságot az Excel szokott csinálni. És úgy védheted ki, hogy átállítod a Windows területi beállításokat amerikaira.

    Mindentől függetlenül dejavu érzésem van: nem mondtam még, hogy használd a forráskód </> gombot?  Ha nem, akkor most mondom, sokkal könnyebben olvasható lesz a beidézett kódod.

    Bónusz gyorsítási javaslat: ez első if...end blokk végére pontosvessző helyett else -t írj, akkor a második if-es vizsgálat már nem is kell. Mert ugye vagy van a webáruházban olyan rekord, vagy nincs. Ez 12300 x 5700 rekord esetén már szerintem számíthat sebességben.
    Mutasd a teljes hozzászólást!
  • Nem rémlik, de ha így is volt, vagy sem, legközelebb úgy szúrom be a kódot :)

    Eredetileg az általad leírt szerint volt, csak kipróbáltam így is, aztán utána jöttem rá, hogy hol keressem a problémát.

    Egyébként nem Excelt használok, ha webes feladatom van, hanem LibreOffice Calc-ot.
    Sajnos kénytelen vagyok ";"-t használni, mert a megnevezés tartalmaz ","-t. És pont ez lett a hiba.
    Így olvasom be a csv-t:

    with webaruhaz_query do begin Active:=False; SQL.Clear; SQL.LoadFromFile('./webaruhaz_sql.txt'); ExecSQL; end; webaruhaz_tabla.Refresh;

    És a file:
    LOAD DATA LOCAL INFILE 'C:/keszlet_sap_20170719.csv' INTO TABLE keszlet.sap_keszlet FIELDS TERMINATED BY ';'

    De a terminated by eredetileg "," volt, így ott, ahol a megnevezésben is volt, ott a mennyiség mező értéke hibás lett. Pláne, ahol pl. 37,5 szerepelt (ez egy munkaruházati megjelölés), mert ott a mennyiség 5 lett, jelen esetben 1 helyett.

    Emiatt kénytelen vagyok tábla exportnál is ";" -t használni, de szerencsére a webáruházban állítható a csv importnál, hogy mit vegyen figyelembe, illetve a saját php file is ezt kezeli.

    Szóval úgy tűnik, hogy egyszerűen egyik helyen vesszőt, a másik helyen pontosvesszőt használtam. :)
    Mutasd a teljes hozzászólást!
  • (mondtam, hogy lehet, hogy nem mondtam  akkor bocs)

    Rendben, akkor most megoldódott, vagy van-e még probléma?
    Ha csak saját magad számára exportálsz/importálsz és zavar a pontosvessző, akkor használhatsz bármilyen más karaktert, ami nem fordul elő a sorokban | ~ :
    Mutasd a teljes hozzászólást!
  • :D
    Ma még nem csináltam készletfrissítést. Hamarosan kiderül. :)
    Egyáltalán nem zavar a pontosvessző, sőt jelen esetben nekem most jobb is, mert a webáruházban csak vessző vagy pontosvessző közül választhatok. A szövegben előforduló vesző miatt meg marad a pontosvessző.
    Mutasd a teljes hozzászólást!
  • Sikerült.
    Szóval más baj nem volt, mint összekeveredtem a vessző - pontosvessző párossal :)
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd