Forum Delphi.cz

Delphi => Obecné => Téma založeno: Faltynek 25-03-2020, 17:23:00

Název: ADOpřipojení tabulky Excelu
Přispěvatel: Faltynek 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.
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: Faltynek 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 (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í.
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: Radek Červinka 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.
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: Faltynek 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í.
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: Faltynek 26-03-2020, 14:38:12
Jak se dá vložit obrázek do příspěvku?
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: Stanislav Hruška 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
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: Stanislav Hruška 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á.
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: Faltynek 26-03-2020, 16:40:17
Ahoj,
FireDAC nemám..
Dalibor.
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: Radek Červinka 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?
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: Faltynek 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.
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: miroB 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.
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: Faltynek 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. :)
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: miroB 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.
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: Stanislav Hruška 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 (https://www.youtube.com/watch?v=C1AjHxBiKmk)
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: Faltynek 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
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: Faltynek 12-04-2020, 14:39:28
Tak jsem to zkusil bez ADOConnection komponenty a to napřímo jsem do connectionstringu v ADOQuery zadal
Kód: Delphi [Vybrat]
  1. Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:\PT100.xlsx;Extended Properties=Excel 12.0;Persist Security Info=False
do SQLstringu potom Select * from [List1$]
a ejhle funguje to jak má.
Asi v té ADOConnection komponentě je něco, co se musí povolit ale neodhalil jsem co.

Dalibor. ???
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: RomanNTA 13-04-2020, 21:27:29
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.

Ahoj. Je nutný ten přístup přes ADO ? Přímo z Delphi se dá přistupovat k Excelu přes COM, DCOM, číst/vkládat data do buněk,  spouštět makra apod. Není to pro Tebe lepší způsob ? Kdysi se mi moc líbil import OLB (?) souboru, který vytvořil, interface + server Excelu a pomocí toho se pak ovládal Excel jak tahací panák. (... jen myšlenka, tak mě nekamenujte).
R.
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: Faltynek 13-04-2020, 22:33:36
Ahoj
a děkuji za odpověď. Přes to názvosloví jsem nikdy moc nebyl, možná myslels něco jako
Kód: Delphi [Vybrat]
  1.      AppExcel:=createoleobject('Excel.Application');
  2.      AppExcel.visible:=true;
  3.      AppExcel.SheetsInNewWorkbook:= 2 + pocetlistuEL;
  4.      AppExcel.workbooks.Add;
  5.      verze:=AppExcel.Version;
  6.      if strtofloat(copy(verze,1,2)) > 11 then FExcelName:=copy(F2name,1,length(F2name)-3) + 'xlsx' else FExcelName:=copy(F2name,1,length(F2name)-3) + 'xls';
  7.      listfyz:=AppExcel.Workbooks[1].Worksheets[2];
  8.      if flagexportall then listEL:=AppExcel.Workbooks[1].Worksheets[3];
  9.      listfyz.select;
  10.      haj:=pocetmist;
  11.      Matice:= VarArrayCreate([1,pocmer+8,1,haj+1],varVariant);
  12.  
a potom třeba
Kód: Delphi [Vybrat]
  1.         { *** Cyklus načtení hodnot do matic *** }
  2.         for i := 1 to pocmer do
  3.         begin
  4.             k:=0;
  5.             for j := 1 to pocetmist do
  6.             begin
  7.                 read(F2, recF2);
  8.                 if (j=1) then
  9.                 begin
  10.                     matice[8+i,j]:=recF2.cas1;
  11.                     if flagexportall then maticeEL[8+i,j]:=recF2.cas1;
  12.                 end;
  13.                 if (j>=lou) and (j<=haj) then k:=k+1;
  14.                 matice[8+i,k+1]:=recF2.mfyz1;
  15.                 if flagexportall then maticeEL[8+i,k+1]:=recF2.mdat1;
  16.             end;   //j
  17.         end;   //i
  18.         { *** Nakopírování naměřených hodnot do listu *** }
  19.         listfyz.Range[listfyz.cells[1,1], listfyz.cells[pocmer+8,haj+1]].Value := Matice;
  20.         { *** Nakopírování elektrických hodnot do listu *** }
  21.         if flagexportall then listEL.Range[listEL.cells[1,1], listEL.cells[pocmer+8,haj+1]].Value := MaticeEL;
  22.  
  23.         VarClear(matice);
  24.         VarClear(maticeEL);
  25.  
  26.         { *** Nakopírování vzorců do listu *** }
  27.         listfyz.Range[listfyz.Cells[4, 2], listfyz.Cells[4, haj - lou + 2]].FormulaR1C1:= '=AVERAGE(R[+5]C:R' + Trim(IntToStr(Pocmer+8)) + 'C)';
  28.         listfyz.Range[listfyz.Cells[5, 2], listfyz.Cells[5, haj - lou + 2]].FormulaR1C1:= '=MIN(R[+4]C:R' + Trim(IntToStr(Pocmer+8)) + 'C)';
  29.         listfyz.Range[listfyz.Cells[6, 2], listfyz.Cells[6, haj - lou + 2]].FormulaR1C1:= '=MAX(R[+3]C:R' + Trim(IntToStr(Pocmer+8)) + 'C)';
  30.         listfyz.Range['A8'].FormulaR1C1:= '=Count(R9C2:R' + Trim(IntToStr(Pocmer+8)) + 'C2)';
  31.         listfyz.Range[listfyz.Cells[7, 2], listfyz.Cells[7, haj - lou + 2]].FormulaR1C1:= '=STDEV(R[+2]C:R' + Trim(IntToStr(Pocmer+8)) + 'C)/SQRT(R8C1)';  // + inttostr(pocmer);
  32.         ...
  33.  
tak to používám, i když ne zrovna na databázi čidel.

Jenže co když v počítači excel není a je tam nějaký open office apod.
Dalibor.

Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: RomanNTA 14-04-2020, 18:51:57
Ahoj. V podstatě ano. Předpokládám, že máš v Delphi komponentu, kterou používáš.
Ty jsi psal o načítání a ukládání do Excelu ... na to jsem reagoval. Že tam Excel není a nebo, že použiješ OpenOffice ... to mi v textu uniklo.
Název: Re:ADOpřipojení tabulky Excelu
Přispěvatel: Faltynek 17-04-2020, 09:19:51
Obvykle tam Excel je, ale není to vždycky tak. Někdy je nutné na měření použít místní počítač, který jej mít nemusí.