Autor Téma: ADOpřipojení tabulky Excelu  (Přečteno 2400 krát)

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
ADOpřipojení tabulky Excelu
« kdy: 25-03-2020, 17:23:00 »
Ahoj,
prosím o radu, pokouším se připojit excelovskou tabulku PT10.xls pře ADO v Delphi 2009 ve skupině dbGO.
Teď naposledy ADODataset, vygenerovaný connectionstring je
Kód: Delphi [Vybrat]
  1. Provider=MSDASQL.1;Persist Security Info=False;Data Source=firmy;Mode=ReadWrite
commandtext je
Kód: Delphi [Vybrat]
  1. select EV_CIS from List1$Oblast_tisku
i když by tam měl být podle mě jenom
Kód: Delphi [Vybrat]
  1. select EV_CIS from List1$
a při pokusu  o nastavení vlastnosti active=true
se objeví hlášení (dal bych sem obrázek ale nevím jak)
Microsoft [Ovladač ODBC pro Excel] Syntaktická chyba v klauzuli FROM

Zkoušel jsem se připojit taky přes TTable ze skupiny BDE a to funguje. Tu excelovskou tabulku mám definovanou v ODBC zdrojích 32 bit jako Firmy.
Tak nevím, BDE by už snad fungovat ve Windows 10 ani nemělo, ale co já vím.

Díky za radu Dalibor.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:ADOpřipojení tabulky Excelu
« Odpověď #1 kdy: 25-03-2020, 19:39:31 »
Našel jsem tuto problematiku na stránce https://www.vladimirklaus.cz/CZ/clanky-detail/419/jak-pristoupit-z-delphi-k-ms-excel-souborum-xlsx ,
ale to řešení bohužel na mých Delphi 2009 nefunguje - havaruje to už při testu připojení.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3329
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:ADOpřipojení tabulky Excelu
« Odpověď #2 kdy: 25-03-2020, 20:34:26 »
ja pouzivam
Kód: Delphi [Vybrat]
  1.     sHeader := 'HDR=Yes';
  2.     if AnsiLowerCase(ExtractFileExt(edtXLSFile.Text)) = '.xls' then
  3.       Result := Format('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Extended Properties="Excel 8.0;%s;IMEX=1"', [edtXLSFile.Text, sHeader])
  4.     else
  5.       Result := Format('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;Extended Properties="Excel 12.0;%s;IMEX=1"', [edtXLSFile.Text, sHeader]);
  6.  
  7. pak
  8. Connection.GetTableNames...
  9.  
  10.  sSQL := Format('SELECT * FROM [%sa%d:IV]', [sCaption, Round(rxcFirstData.Value)]);
  11.  
kde sCaption je jedna z tech tabulek a rxcFirstData je od ktereho radku, ale to jde i bez toho.
Embarcadero MVP - Czech republic

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:ADOpřipojení tabulky Excelu
« Odpověď #3 kdy: 26-03-2020, 14:33:40 »
Díky, tento kód funguje:
Kód: Delphi [Vybrat]
  1. procedure TForm3.Button1Click(Sender: TObject);
  2. var sHeader, Result, sSQL, sCaption : string ;
  3. begin
  4. //d:\Vyvoj\Mer2014_D2009_beta\DB_PT100.xlsx;
  5. sHeader := 'HDR=Yes';
  6.     if AnsiLowerCase(ExtractFileExt(edtXLSFile.Text)) = '.xls' then
  7.       Result := Format('Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s;Extended Properties="Excel 8.0;%s;IMEX=1"', [edtXLSFile.Text, sHeader])
  8.     else
  9.       Result := Format('Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;Extended Properties="Excel 12.0;%s;IMEX=1"', [edtXLSFile.Text, sHeader]);
  10.  edit1.Text:=result;
  11.  
  12.  adoc1.ConnectionString:=result;
  13.  adoc1.Connected:=true;
  14.  adoc1.GetTableNames(Listbox1.items,false);
  15.  
  16.  sCaption:=Listbox1.Items[2];
  17.  sSQL := Format('SELECT * FROM [%sa%d:IV]', [sCaption, Round(10)]);
  18.  
  19.  edit2.Text:=ssql;
  20.  
  21.  ADOQuery1.SQL.Clear;
  22.  ADOQuery1.SQL.Add('SELECT * FROM [DB_PT100$]');
  23. // ADOQuery1.SQL.Add(ssql);
  24.  ADOQuery1.Open;
  25.  
  26. end;
  27.  
  28. end.

Ten řádek 23 vyvolá chybu "Objekt Parametr je nesprávně definován.", tak jsem do SQL dal přímo název tabulky. v proměnné sSQL je toto: SELECT * FROM [DB_PT100$a10:IV] (chtěl jsem od řádku 10). IV má být asi poslední zahrnutý sloupec?

V gridu se data zobrazí, ale nejdou editovat. Ve staré Query se dal nastavit parametr RequestLive, v TADOquery není.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:ADOpřipojení tabulky Excelu
« Odpověď #4 kdy: 26-03-2020, 14:38:12 »
Jak se dá vložit obrázek do příspěvku?
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7303
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:ADOpřipojení tabulky Excelu
« Odpověď #5 kdy: 26-03-2020, 15:19:54 »
Jak se dá vložit obrázek do příspěvku?
Ja ich dávam ako prílohu. Väčšinou to stačí. Priamo do príspevku to neviem
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7303
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:ADOpřipojení tabulky Excelu
« Odpověď #6 kdy: 26-03-2020, 15:26:54 »
Citace
V gridu se data zobrazí, ale nejdou editovat. Ve staré Query se dal nastavit parametr RequestLive, v TADOquery není.
TFDQuery sa použiť nedá? Ten to má.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:ADOpřipojení tabulky Excelu
« Odpověď #7 kdy: 26-03-2020, 16:40:17 »
Ahoj,
FireDAC nemám..
Dalibor.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 3329
  • Karma: 112
    • Verze Delphi: D2007, DXE + 2 poslední
    • O Delphi v češtině
Re:ADOpřipojení tabulky Excelu
« Odpověď #8 kdy: 26-03-2020, 16:50:25 »

V gridu se data zobrazí, ale nejdou editovat. Ve staré Query se dal nastavit parametr RequestLive, v TADOquery není.


Tak si to nacucni do memory table. Tohle mi slouzilo jen pro import. Co vlastne chces delat?
Embarcadero MVP - Czech republic

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:ADOpřipojení tabulky Excelu
« Odpověď #9 kdy: 26-03-2020, 17:16:10 »
Mám v tom seznam čidel s kalibračníma konstantama. V měřicím programu si podle čísla čidla načítám konstanty a kalibrační lhůty. Teď to mám tak, že to vyplním v excelu a převedu do csv a tu csv tabulku pak načítám jako texták a v Delphi parsuju přes středníky. Tomu převádění bych se rád vyhnul. Potud by mi stačilo tabulku jenom načíst, ale když narazím na čidlo, které má třeba novou kalibraci, nebo v tabulce vůbec není, rád bych ho přímo doplnil a uložil zpátky to toho excelu.
Normálně bych to asi nechal plavat, ale teď jsem doma a mám čas, tak procházím resty. Tak proto.
A proč je to v Excelu? No má to historické kořeny.

Dalibor.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline miroB

  • Guru
  • *****
  • Příspěvků: 600
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:ADOpřipojení tabulky Excelu
« Odpověď #10 kdy: 26-03-2020, 21:07:55 »
Databázy dnes vedia Excel tabuľky len čítať (Read), alebo naplniť dáta tak, že sa vytvorí nová tabuľka a tá sa naplní (Napr. ADO: INSERT INTO SELECT, pričom tabuľka nesmie existovať). Myslím, že sa nedajú ani mazať (DROP TABLE).
Neviem o tom, že by dnes nejaký databázový stroj vedel priamo editovať excel tabuľky. Voľakedy to išlo práve pomocou ADO. Lenže nejaký nešťastník (tuším z Mexika), zažaloval Microsoft o patent. Nie málo, tuším o 50 miliónov $. Detaily si už nepamätám, pretože je to nejmenej 10+ rokov.
Behom pár mesiacov Microsoft tú feature zarezal. Nešťastná to firma, ktorá si z užívateľov občas spraví trhací kalendár. Viď ADO vs ODBC vs ADO (deprecated vs undeprecated). Alebo zarezaný Skype na Bada a mnohé iné.
Napríklad aj ADO + CSV je veľmi nebezpečná záležitosť. Viď parameter "TypeGuessRows" v ConnectionString.
On totiž nefunguje parameter pre skúmanie typu importovaných údajov stĺpci. Default je 8. Napríklad výraz "TypeGuessRows=0", je už roky ignorovaný. Ak sa v dátach, v 9-tom riadku vyskytne text a predtým boli čísla, tak hodnota v deviatom riadku bude obsahovať NULL, lebo daný stĺpec bude braný ako typ integer. Dá sa to zmeniť jedine v Registry, ale to je veľmi diskutabilné.
Vlastne, ten desaťročia nefungujúci parameter TypeGuessRows, robí ADO absolútne nespoľahlivým pre Import CSV, Excel a čokoľvek ďalšie. Tuším okrem samotného MS Access.
Plus večné problémy pri inštalácii driverov ADO (voľakedy boli priamo súčasťou Windows, dnes pri každej novej Office verzii nové patálie). Dva super vážne dôvody prečo ADO radšej neponúkať zákazníkom.

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:ADOpřipojení tabulky Excelu
« Odpověď #11 kdy: 26-03-2020, 22:28:25 »
Tak to je síla. Je fakt, že někdy v 98 roce jsem databázové editoval  Excel z VB4 a šlo to jednoduše. Typ dat určovala první položka pod nadpisem sloupce a pokud to bylo číslo a někde v dalším řádku text, tak to hodilo chybu. Ale šlo to intuitivně a snadno přes jet engine myslím.
Nějak nás ten vývoj nutí čím dál víc chodit s kanonem na vrabce. :)
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline miroB

  • Guru
  • *****
  • Příspěvků: 600
  • Karma: 17
    • Verze Delphi: D1,2,3,4,7,2005,2009, XE8,S,B,T10.2.2 Pro
Re:ADOpřipojení tabulky Excelu
« Odpověď #12 kdy: 27-03-2020, 07:45:20 »
Vyšiel som z cviku. Trochu som motal ADO vs Jet Engine, alebo po novom ACE OLEDB Engine. Ale princíp zostáva. Verím, že aktívni užívatelia si premietnu fakty na správne miesta a ostatní si ľahšie uvedomia podstatu.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7303
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re:ADOpřipojení tabulky Excelu
« Odpověď #13 kdy: 28-03-2020, 19:55:00 »
Neviem čo tam je. Anglicky neviem. Ale názov hovorí o tejto téme
https://www.youtube.com/watch?v=C1AjHxBiKmk
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 228
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:ADOpřipojení tabulky Excelu
« Odpověď #14 kdy: 11-04-2020, 14:59:50 »
Ahoj.
Citace
Neviem čo tam je. Anglicky neviem. Ale názov hovorí o tejto téme
https://www.youtube.com/watch?v=C1AjHxBiKmk
tak jsem se k tomu po čase vrátil, v tom odkaze je video s fungujícím příkladem v C++ Builderu 10 Seattle pro starší verzi Excelu. Udělal jsem to skoro stejně tak v Delphi 2009, ale pořád to hlásí při pokusu o změnu libovolné položky a přejití na jiný řádek DBGridu, že musí být použit aktualizovatelný dotaz. V ADOConection1.Mode mám cmReadWrite, v DBGridu editovat můžu, tak už nevím kde hledat toho psa. Zakopanýho.
 :P
Dalibor (D2009 Enterprise, dřív D5Enterprise)