ADO-val 2012/08: Érvénytelen könyvjelző

ADO-val 2012/08: Érvénytelen könyvjelző
2012-08-17T11:59:47+02:00
2012-08-20T10:01:28+02:00
2022-11-26T15:35:38+01:00
Micu
Sziasztok!

Excel VBA-ból csatlakozom (conn változó) access (mdb) adatbázishoz ADO-val (de DAO-val is próbáltam)

A csatlakozás sikeres és utána jön egy lekérdezés:
strsql = "SELECT mezo FROM tabla " & _ " WHERE SzovegesDatum between '2012/01/01 00:00:00' And '2012/01/31 23:59:59' GROUP BY mezo " rs.Open strsql, conn

Hibátlanul lefut (A SzovegesDatum mezőben pl: "2012/03/30 12:14:59" van.)


Csak nekem éppen augusztusig kellene, így gondoltam:
strsql = "SELECT mezo FROM tabla " & _ " WHERE SzovegesDatum between '2012/01/01 00:00:00' And '2012/08/31 23:59:59' GROUP BY mezo " rs.Open strsql, conn

Tehát a második (szöveges) dátumban 01 helyett 08-at írtam.

Jutalmul: "Érvénytelen könyvjelző" hibaüzenetet ad az rs.open.
"05"-el jó, nagyobb "számmal" már nem.
' helyett "-el is próbáltam.

Az adatbázisban típust nem cserélhetek.
Ha
replace(DateTime, ...) (vagy (csere())
formával próbálkozom, akkor "replace() függvény nincs definiálva" üzenet a jutalom.

A "legjobb" ötletem
left(DateTime,4) & mid(DateTime,6,2) & mid(DateTime,9,2) & right(DateTime,8) between '2012010100:00:00' And '20120831235959'
De ugyebár szövegek darabolása nem a legszebb.


Hogyan lehetne rávenni, hogy a normál "2012/08/31 23:59:59" szöveges formát is kezelje?


Előre is köszi a segítséget!
Mutasd a teljes hozzászólást!
Csak tipp:
Access-en belül le tudod kérdezni vagy akkor is van valami hiba?
Nem lehet, hogy esetleg hibás az adatbázis?
pl.
http://www.articlesbase.com/software-articles/resolving-invalid-book..
Mutasd a teljes hozzászólást!

  • Accessben ugyan az a lekérdezés (kiírattam az immediate ablakba, onnan áttettem access sql lekérdezésbe) hibátlan.
    Mutasd a teljes hozzászólást!
  • Szia!
    Hát lehet be kellene szíjaznod magad a székbe, mert ezt sikerült alkotni:

    datetimevaltol = Val(Replace(Replace(Replace("2012/01/01 00:00:00", "/", ""), ":", ""), " ", "")) datetimevalig = Val(Replace(Replace(Replace("2012/08/31 23:59:59", "/", ""), ":", ""), " ", "")) datetimevalakt = Val(Replace(Replace(Replace("2012/08/19 00:30:00", "/", ""), ":", ""), " ", "")) If datetimevaltol < datetimevalakt And datetimevalig > datetimevalakt Then MsgBox "datetimevaltol = " & datetimevaltol & vbCrLf & "datetimevalig = " & datetimevalig & vbCrLf & "datetimevalakt = " & datetimevalakt Else MsgBox "Nincs benne" End If

    Lehet, hogy randa de működött.

    palp
    Mutasd a teljes hozzászólást!
  • Ja és:



    Jobb nem jutott eszembe



    palp
    Mutasd a teljes hozzászólást!
  • Köszi, de nem tudom, ezt hogy adom át egy Access lekérdezésnek?

    Mert a fő gond, hogy Access-ben van karakteresen a dátum, és valahogy nem szívesen hívnék le jó pár ezer rekordot, hogy utána VBA-ban elkezdjem rekordonként vizsgálni, hogy melyik tétel felel meg nekem.

    Ráadásul a lenti (minta) lekérdezés csak egy "szűrő", ami valóságban 2 mezőt ad vissza
    strsql = "SELECT mezo1, min(mezo2) FROM tabla ..."
    és a 2 mező együtt adja majd a részeredményt, aminek
    a rekordjait kell egy másik táblához hozzákapcsolnom.
    ID (számláló mező) nincs.

    Tehát ennek a lekérdezésnek a mezői adják a szűrési szempontot egy másik táblához.

    Tudom a szerkezet nem szerencsés (és akkor finoman szóltam), de mivel nem az én rendszerem, így változtathatok rajta.
    Mutasd a teljes hozzászólást!
  • És így:
    SELECT Tábla1.SzovegesDatum, Tábla1.mezo FROM Tábla1 WHERE (((Val(Replace(Replace(Replace([SzovegesDatum],"/",""),":","")," ",""))) Between Val(Replace(Replace(Replace("2012/01/01 00:00:00","/",""),":","")," ","")) And Val(Replace(Replace(Replace("2012/08/31 23:59:59","/",""),":","")," ",""))));

    palp
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Köszi, hogy foglalkozol vele, de:

    formával próbálkozom, akkor "replace() függvény nincs definiálva" üzenet a jutalom.


    És mint írtam, az adatbázisba (mdb) nem nyúlhatok bele, pedig nagyon egyszerű lenne oda betenni egy lekérdezést, amire ADO-ból hivatkozhatok
    Mutasd a teljes hozzászólást!
  • Szia!

    Milyen Access és milyen Excel?

    palp
    Mutasd a teljes hozzászólást!
  • mdb (2003), Excel 2007 (szép, vegyes rettenetes )
    Mutasd a teljes hozzászólást!
  • Excel 2007 (szép, vegyes rettenetes )
    Kompatibilis módban (Excel 2003)?
    Ha adatbázis motor probléma akkor:
    dbengine
    Hátha segít.
    palp
    Egyébként nem rettenetes. Inkább kihívás.
    Mutasd a teljes hozzászólást!
  • Nem, valódi 2007 (xlsm)

    Azért próbáltam ADO-al.

    De ahol (még) teszteltem, ott ráadásul 2010 accdb és 2010-es Excel alatt is előadja

    Mutasd a teljes hozzászólást!
  • Tudnál egy 2003-as teszt.mdb-t - tömörítve - ide csatolni?
    Nekem ez a széria kimaradt.
    szerk.:
    Most látom, írod, hogy 2010-es accdb-vel is hasonló eredmény.
    Bármilyen lekérdezés, vagy csak a konkrét produkálja e hibát?
    Mutasd a teljes hozzászólást!
  • Én úgy értettem, Excel 2003-mal kompatibilis módban.
    Mutasd a teljes hozzászólást!
  • Ha a feltételben:
    '2012/01/31 23:59:59'
    akkor jó,
    '2012/04/31 23:59:59'
    akkor jó

    '2012/06/31 23:59:59'
    vagy
    '2012/08/31 23:59:59'
    vagy
    '2012/12/31 23:59:59'
    (tehát 6-12)
    akkor rossz
    ====================================

    De hogy teljes legyen az örömöm, a 106 ezer rekordból kitöröltem, hogy legyen minta (mivel céges adatbázis és nem adhatom ki), maradt egy rekord, így jó lett a "rossz" lekérdezés.
    Majd (ismét) az eredetit csökkentettem 50.000 rekordra és ekkor is jó lett.

    Ebből levonom azt a "megoldást" hogy vagy a rekordszám , vagy (aminek nagyobb a valószínűsége) az 50.000 feletti valamelyik rekord okozta a hibát. (Ha majd rengeteg időm lesz, akkor meg is keresem, melyik. )


    Nagyon köszönöm palp-nak az ötleteket, Rihanak, hogy rákényszerített, hogy rájöjjek a hibára, de azt hiszem Robi80-nak lett igaza ("
    Nem lehet, hogy esetleg hibás az adatbázis?
    "), így az ő válaszát fogadom el.

    Plusz köszönöm az idejét azoknak, akik elgondolkodtak a kérdésem/bénaságom felett
    Mutasd a teljes hozzászólást!
  • Nincs mit.
    Nem lehet, hogy vmi. szemét (szóköz*n,pont stb.) van a vizsgált mezőben?
    Esetleges konverziónál hibát okozhat. Asszem.
    Szép feladat volt.
    palp
    "Ellenőrzött adatbevitel, kevesebb gond"
    Mutasd a teljes hozzászólást!
  • Esetleges konverziónál hibát okozhat

    Elvileg minden szöveg De ezek szerint valahol belekeveredett.

    "Ellenőrzött adatbevitel, kevesebb gond"


    Jó adatbázisterv meg még kevesebb
    Csak az ember azzal dolgozik, amije van
    Mutasd a teljes hozzászólást!
  • Ha majd rengeteg időm lesz, akkor meg is keresem, melyik

    Max. 15 tétel vizsgálata után már megtalálod a huncut sort.
    Mutasd a teljes hozzászólást!
  • Így, hogy már nem érdekes, mert megtudtam, hogy valahol egy rekord rossz és nem kezdhetek vele semmit?

    Vagy a felezgetős keresésre gondolsz?
    Igazán a törölgetés tart sokáig.
    Mutasd a teljes hozzászólást!
  • Vagy a felezgetős keresésre gondolsz?

    Igen, s ha a felső 56000 felezésekor is van hiba, ugye akkor már a rekordszám kilőve, ha nincs, akkor a rekordszám nyert.
    Azért győzködlek, mert furdal a kiváncsiság (tudom, kibicnek...).
    Mutasd a teljes hozzászólást!
  • Akkor már ketten vagyunk.
    palp
    Mutasd a teljes hozzászólást!
  • ++extras:
    "Mert a fő gond, hogy Access-ben van karakteresen a dátum, és valahogy nem szívesen hívnék le jó pár ezer rekordot, hogy utána VBA-ban elkezdjem rekordonként vizsgálni, hogy melyik tétel felel meg nekem."
    Mutasd a teljes hozzászólást!
  • Tegyük fel, hogy a 96000-ik rekord hibás. Ekkor a:

    between '2012/01/01 00:00:00' And '2012/01/31 23:59:59'

    miért fut le hiba nélkül? Mert ugye ez is elvégzi az összehasonlítást a 96000-ik rekordon is függetlenül attól, hogy belekerül-e a recordsetbe, vagy nem.

    Itt azért nem kicsi ellentmondást látok.
    Mutasd a teljes hozzászólást!
  • Oké, a jövő héten megpróbálom megnézni.
    Mutasd a teljes hozzászólást!
  • Szerintem az összehasonlításnál (tesztelve):
    '2012/07/19 1:30:00' <> '2012/07/19 01:30:00'
    Amit elfogadott jól:
    ',2012/07/19 01:30:00'
    '2012/07/19 01:30:00,'
    '2012.07.19 01:30:00'
    Azt ugye meg nem tudni az adatokat hogyan vitték fel.
    Feltéve, hogy excel akkor nem mindegy, hogy:
    A. cellaformázás milyen:
    "éééé.hh.nn ó:pp" vagy "éééé.hh.nn óó:pp"

    B. vagy a konverzió:
    A1=2012.07.19 0:30 (dátum,"éééé.hh.nn ó:pp")
    =SZÖVEG(A1;"éééé/hh/nn ó:pp:mm") => 2012/07/19 0:30:00
    vagy
    =SZÖVEG(A1;"éééé/hh/nn óó:pp:mm") => 2012/07/19 00:30:00

    Asszem (próba excel 2007 - 2003 kompatibilis mód)

    Így talán Micu az első körben talán ki tudja szűrni szöveghosszal a hibás dátumokat.

    palp
    Mutasd a teljes hozzászólást!
  • 2. torzszülött:

    WHERE (((Tábla1.SzovegesDatum) Between '2012/01/01 00:00:00' And '2012/08/31 23:59:59')) OR (((Tábla1.SzovegesDatum) Between '2012/01/01 0:00:00' And '2012/08/31 23:59:59')) OR (((Tábla1.SzovegesDatum) Between '2012/01/01 0:00:00' And '2012/8/31 23:59:59')) OR (((Tábla1.SzovegesDatum) Between '2012/01/01 00:00:00' And '2012/8/31 23:59:59'))

    Úgy tűnik ez is működik, ha a fenti hiba fennáll.
    Ha már:
    Jó adatbázisterv meg még kevesebb
    Csak az ember azzal dolgozik, amije van


    palp
    Mutasd a teljes hozzászólást!
  • Az adatok Access-be valami külső programmal lettek beírva. Csak a kiolvasás kellene Excelben, mert abban tudják egyszerűen feldolgozni.
    Mutasd a teljes hozzászólást!
  • Azt ugye meg nem tudni az adatokat hogyan vitték fel.


    Ebben lehet valami, de szerintem ha a dátumban csak számjegyek és írásjelek vannak(esetleg &H00), akkor nem szabadna ilyen módon elszállnia:
    "Érvénytelen könyvjelző" vagy
    "replace() függvény nincs definiálva"

    Ráadásul(ha jól értelmeztem) ez meg működik:
    "left(DateTime,4) & mid...."

    Az még előfordulhat, hogy a 8. karaktertől kezdve valahol van egy vezérlőkarakter úgy, hogy ez a karakter vizsgálat alá esik, akkor talán elszállhat(bár számomra az sem teljesen világos, hogy stringként vizsgálva vezérlőkaraktert miért utasításként vesz figyelembe).

    Természetesen próbálgatni csak Micu tudja, de én első körben ezeket vizsgálnám, és nézném, hogy hogyan reagál(elszáll-e vagy sem).

    1. ha csak kizárólag a 8. karaktert hasonlítom össze("/"). 2. '2012/06/01 00:00:00' And '2012/06/31 23:59:59' esetén 3. '2012/07/01 00:00:00' And '2012/07/31 23:59:59' esetén

    És elgondolkodnék, hogy miért olyan eredményeket kaptam, amit...
    Pl. ha már az 1. esetben a Mid() hibát ad, akkor tuti, hogy valamelyik rekord 8. karaktere problémás a vizsgált mezőben stb...

    Ha az jön ki, hogy valamelyik karakterrel van a probléma, akkor áttérnék a fájl bináris vizsgálatára(2003-as esetén ez nem bonyolult). Az alap hex string ez lenne:

    50 48 49 50 47 48 54

    Ez "2012/06" hex formában. Kétféle úton lehetne tovább indulni:
    1. hex editorban keresés erre a hex stringre
    2. vba-ban bináris fájlként megnyitni és úgy keresni rá ugyanerre

    Mindkét esetben azt nézném meg, hogy milyen karakter áll a "54" után(mert szerintem ez a joker karakter(bár ha a 3 vizsgálat eredménye mást mutat, akkor azon az úton kell elindulni...).
    Ha unicode-ban vannak tárolva, akkor persze annak megfelelően módosítani kell a hex stringen...

    Az a baj, hogy nagyon sok variáció lehetséges(már csak a 3 vizsgálat eredménye is sokféle lehet), és így látatlanban elég nehéz...
    Mutasd a teljes hozzászólást!
  • Köszi, hogy foglalkoztok vele


    "Ráadásul(ha jól értelmeztem) ez meg működik:"

    Tökéletesen értelmezed
    A
    left(DateTime,4) & mid(DateTime,6,2) & mid(DateTime,9,2) & right(DateTime,8) between '2012010100:00:00' And '20120831235959'
    formával megy (ezt használom megoldásként) és úgy néz ki, jó eredményt is ad.

    Tehát a left/mid/right függvények "tetszenek" neki.

    "Érvénytelen könyvjelző"

    Engem is ez akasztott ki. Ráadásul ADO és DAO csatlakozásnál is ua.

    "replace() függvény nincs definiálva"

    A replace-t feltehetően az ADO-Access páros nem szereti.
    Lehet hogy csak a magyar Access miatt (ott ugye csere()), de nem tudom, ahol használják, ott milyen lesz. A nyelvfüggő dolgokat meg nem szeretem.

    "bár számomra az sem teljesen világos, hogy stringként vizsgálva vezérlőkaraktert miért utasításként vesz figyelembe"

    Nekem az se, hogy miért csak az 05. hónap után dobja el magát.

    ----
    6 óra kínlódás után adtam fel (és tettem fel kérdésként), a munka egésze (ha ezt leszámítjuk), 3 óra volt. (És ne nézzük, hogy ti hány órát gondolkodtok rajta.)
    Nagyon megéri
    Mutasd a teljes hozzászólást!
  • Ha pl. az általad 2012.08.19. 10:14-i hszedben levő fájlt megnyitom, akkor ott a "2012/06"-ot a &H33F2C == 212780 offszeten van, és ez az egyetlen találat(az általad feltöltött fájlban nem unicode-ban van tárolva.

    --
    Micu:
    "És ne nézzük, hogy ti hány órát gondolkodtok rajta."

    Nálam nem órákról van szó. Ettől függetlenül engem is érdekel ez.
    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