Autor Téma: OLE komunikace s Abra Gx - zapis nove firmy chyba "Clen nebyl nalezen"  (Přečteno 3335 krát)

Offline imcon

  • Příspěvků: 7
  • Karma: 0
Dobry den,
resim import dokladu do Abry pomoci OLE a mam stejny problem, ktery se zde jiz drive resil. Nepovedlo se mi s tim ale pohnout.

Mam kod:

Kód: Delphi [Vybrat]
  1. var AddressData: TObjectData;
  2. ...
  3. AddressData := OLEVariantToObjectData(FirmData.ValueByName('ResidenceAddress_ID'));
  4. ...

kde pretypovani resim podle rady:
Kód: Delphi [Vybrat]
  1. function OLEVariantToObjectData(AOLE: OleVariant): TObjectData;
  2. begin
  3.   Result := IDispatch(TVarData(AOLE).VDispatch) as TObjectData;
  4. end;

Stale mi ale na radku
Kód: Delphi [Vybrat]
  1. AddressData := ...
vyskakuje chyba "Clen nebyl nalezen". Jak uvadel Roman ve VBS vse bezi. V Delphi nevim jak na to.

Muzete mi nekdo poradit kde je zakopany pes? Prace s Abrou je dobra, ale obcas se clovek nekde zasekne a nevi jak dal.

Diky za napovedu.


Honza



(Pro orientaci uvádím níže původní text zprávy)

-------- Původní zpráva --------
Předmět: Re: OLE komunikace s AbraG2
Od: Martin Schayna <mschayna@aktis.cz>
Datum: 5.1.2004 15:46

> Roman <sw.maurice@seznam.cz> wrote:
>> resim prenos skladovych karet do AbraG2 pres OLE a narazil jsem na
>> nasledujici problem pri vytvareni dalsich mernych jednotek:
>>
>> zapis v Delphi, ktery skonci s chybou EOLESysError "Clen nebyl
>> nalezen.": var StoreUnitsCollection:Variant;
>> StoreUnitsCollection:=CardData.ValueByName('StoreUnits');
>>
>> analogicky zapis ve VBScriptu probehne bez problemu:
>> Dim StoreUnitsCollection
>> Set StoreUnitsCollection = CardData.ValueByName("StoreUnits")
>>
>> Polozka StoreUnits (merne jednotky) objektu StoreCard (skladova
>> karta) je dle dokumentace Collection Owned, hadam, ze v tom bude asi
>> ten problem, bohuzel nevim jak jinak k ni pristoupit? Kdyby nekdo
>> vedel, budu rad, at to nemusim resit pres .vbs
>
> V Delphi je navratova hodnota z ValueByName typu OleVariant,
> pro pretypovani z OleVariantu na specificky interface (napr.
> DataCollection) je treba zavolat nasledujici konstrukci:
>
> function OLEVariantToDataCollection(AOLE: OleVariant): DataCollection;
> begin
>    Result := IDispatch(TVarData(AOLE).VDispatch) as DataCollection;
> end;
>
> Pouziti tedy napr. bude
> var StoreUnitsCollection:DataCollection;
> StoreUnitsCollection:=
>    OLEVariantToDataCollection(CardData.ValueByName('StoreUnits'));
>
> Dale muzes pracovat s kolekci StoreUnitsCollection, napr. ji naplnit
> jednotkami atd. Podobne se zachazi s dalsimi specifickymi interfacy
> napr. DataObject apod.
>
> Jsem rad ze muzu pomoci s necim co jsem sam pomahal stvorit
>
> S pozdravem
>
> Martin Schayna
> vedouci projektu Abra G3/G2

Offline leonell

  • Plnoletý
  • ***
  • Příspěvků: 104
  • Karma: 3
Metodou pokus omyl jsem dospěl k tomu, že u těchto typů prostě ValueByName() nefunguje a je třeba zjistit index pole a přistoupit přes index.

Kód: Delphi [Vybrat]
  1. var
  2. AdresaData: OleVariant;
  3. ...
  4. AdresaData := FirmaData.Value[ FirmaData.IndexOf('ResidenceAddress_ID') ];
  5. AdresaData.ValueByName('Location') := 'Útvar vývoje software';
  6. ...
  7.  

Offline imcon

  • Příspěvků: 7
  • Karma: 0
Metodou pokus omyl jsem dospěl k tomu, že u těchto typů prostě ValueByName() nefunguje a je třeba zjistit index pole a přistoupit přes index.

Díky za reakci!
Otázku jsem nenapsal úplně aktuální, protože jsem ji kopíroval z jiného fóra, Index jsem také pochopitelně zkoušel, bohužel to hlásí naprosto stejnou chybu. Tedy je jedno jestli k položce přistupuji pomocí ValueByName nebo Value, chyba je stejná  >:(

Dával jsem dotaz na Abru, protože je programovasná v Delphi, měli by být schopni odpovědět, první odpověď byla mimo, na druhou s upřesněním zatím čekám. Proto uvítám jakoukoli pomoc/spolupráci na rozchození.

Používáte někdo OLE přístup k Abře (nejen pomocí Delphi)?

Offline leonell

  • Plnoletý
  • ***
  • Příspěvků: 104
  • Karma: 3
Ten kod, co jsem poslal, jsem pochopitelne zkousel (AbraOleLib) a funguje.
je soucasti kodu, ktery zalozi firmu vcetne adresy sidla.
Delphi XE2, Abra G2 - 12.03.11.
L.

Offline imcon

  • Příspěvků: 7
  • Karma: 0
Tak tomu se říká pomoc!
Díky za poznámku, po tom co jsi ji napsal jsem se na kód ještě jednou podíval a tady je důvod problémů:

Závorky, které jsem předtím přehlédl...

Žádný z těchto kódů nepracuje:
Kód: Delphi [Vybrat]
  1.         AddressData := FirmData.Value(7);
  2.         AddressData := FirmData.ValueByName('ResidenceAddress_ID');

ale pokud se závarky nahradí hranatými, fungují obě možnosti, tedy funguje i ValueByName kterou jsi také nerozchodil.

Tedy takto lze konstrukci použít a fungují (ověřeno):
Kód: Delphi [Vybrat]
  1.         AddressData := FirmData.Value[7];
  2.         AddressData := FirmData.ValueByName['ResidenceAddress_ID'];

X zbytečně ztracených hodin, dokážete mi někdo zkušenější vysvětlit kdy v takovémto případě použít které závorky? Na čem to závisí?

Ještě jednou díky za nakopnutí!

Honza

Doplnění: ano v typové knihovně AbraOLE_TLB hranaté závorky v property ValueByName nyní vidím, předtím jsem je přehlédl; proč jsou ale u property vždy hranaté a ne kulaté? Tomu nerozumím.
« Poslední změna: 15-07-2012, 00:22:47 od imcon »

Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1559
  • Karma: 37
    • Pepak.net
proč jsou ale u property vždy hranaté a ne kulaté? Tomu nerozumím.
Protože property se navenek tváří jako proměnné. Pokud chci mít jednu proměnnou pro víc hodnot, dělám to pomocí pole. Pole se indexuje pomocí hranatých závorek.