Důležité:


Helios Orange Interface

Z Asseco Solutions
Přejít na: navigace, hledání
groups: lcs ; lcseditor ; partner (ro) ; translator (ro) ; customer (ro) ; anonymous (ro) ;

Tento dokument popisuje veřejná rozhraní Helios Orange pro tvorbu pluginů (ddPlugin.tlb, resp. pro Delphi z něho vygenerovaný ddPlugin_TLB.pas). Napsat plugin, znamená napsat COM server (v libovolném vývojovém nástroji, který to dokáže), který implementuje rozhraní IHePlugin2, které vypadá takto:

Upozornění Je potřeba mít Helios Orange alespoň verze 1.0.2008.0738. Použitá syntaxe je Borland Object Pascal.


Obsah

IHePlugin2 = interface(IUnknown)

procedure Run(const Helios: IHelios);

metoda, kterou volá Helios Orange, když uživatel spustí externí akci (typu plugin)
v metodě Run() dostávám rozhraní IHelios, pomocí kterého z kódu v pluginu komunikuji s Helios Orange
Doporučujeme si raději do metody Run() vašeho pluginu přidat kontrolu na příslušnou verzi Helios Orange:

procedure TComObjekt.Run(const Helios: IHelios);
const JakouMinimalniVerziHeliosuPluginPodporuje = $010020080738;
begin
if Helios.HeVersion < JakouMinimalniVerziHeliosuPluginPodporuje then
raise Exception.Create('Plugin vyžaduje min verzi Heliosu ' +
IntToHex(JakouMinimalniVerziHeliosuPluginPodporuje, 12));
.
.
.


function PartnerIdentification: WideString;

metoda, která by měla Helios Orange vrátit identifikaci (sériové číslo Helios Orange) tvůrce pluginu

Příklad Příklad:
function TMujPlugin.PartnerIdentification: WideString;
begin
Result := 'HEIQ0100-XXXXX'; //místo XXXXX doplnit vaše sériové číslo určené pro vývoj, přidělené firmou LCS
end;


IHelios = interface(IUnknown)

komunikace s přehledem, nad kterým plugin běží

function CurrentRecordID: OleVariant;

vrací ID aktuálního záznamu, nad kterým je plugin spuštěn

Upozornění POZOR v prázdném přehledu vrací hodnotu NULL (proto je typu OleVariant a ne Integer)


function SelectedRecordIDs: WideString;

comma separated IDs, např.: '1,2,5' lze použít přímo do SQL-příkazu IN(), nebo na úrovni Delphi: TStringList.CommaText := SelectedRecordIDs
pokud není označen žádný záznam, vrací ''
tato metoda se nehodí pro více jak řádově stovky záznamů; v tom případě je lepší používat metodu DocasnaTabulkaZOznacenych()


function BrowseID: Integer;

systémové číslo přehledu, nad kterým plugin běží (užitečné, pokud plugin běží nad více přehledy a já potřebuji rozlišit kontext)


procedure Refresh(CelehoBrowse: WordBool);

občerství přehled, nad kterým plugin běží

Refresh(True) - občerství celý přehled
Refresh(False) - občerství jen aktuální záznam (je to rychlejší)


function Locate(const KeyFields: WideString; KeyValues: OleVariant): WordBool;

touto funkcí mohu donutit přehled, nad kterým plugin běží, nastavit se na nějaký konkrétní záznam (např. jsem v přehledu výdejek a plugin vygeneroval výdejku: zavolám Helios.Refresh(True) a potom Helios.Locate('ID', 1234) a uživatel má rovnou vybraný tento záznam).

Upozornění POZOR sloupec se píše bez prefixu tabulky. Funkce vrací informaci, o tom, zda se povedlo (True) nebo nepovedlo (False) najít.


function QueryEdit: IHeQuery;

vrací rozhraní IHeQuery na případný editor, nad kterým je přehled s pluginem. Příklad, kdy je to potřebné: chci mít plugin, který běží nad přehledem položek v editoru faktury a potřebuji se v něm dozvědět číslo odběratele na hlavičce faktury. To jinou cestou nezjistím, protože to co je v editoru hlavičky ještě nemusí být v databázi.

Upozornění POZOR může vracet nil, pokud přehled není nad editorem


function ExtKomID: Integer;

vrací ID z tabulky TabExtKom právě spuštěného pluginu - abych si mohl dotáhnout případné parametry, které mám v editoru externích akcí zadané

Příklad Příklad:
var CestaNaSoubor: String;
with Helios.OpenSQL('SELECT Parametry FROM TabExtKom WHERE Id=' + IntToStr(Helios.ExtKomID)) do
CestaNaSoubor := VarToStr(FieldValues(0));


function QueryBrowse: IHeQuery;

rozhraní přehledu Helios Orange


function MainBrowseTable: WideString;

systémové jméno tabulky nad kterou je browse


function PrintForm(IdForm: Integer): WordBool;

zavolá standardní Heliosovský tisk v přehledu, kde byl plugin spuštěn
pokud dám IdForm=0, ptá se na formulář, jinak přímo vytiskne daným formulářem
vrací True-bylo vytisknuto, False-nebylo


function PrintForm2(IdForm: Integer; const WhereSys: WideString): WordBool;

zavolá standardní tisk Helios Orange v přehledu, kde byl plugin spuštěn, ale na jiný než aktuální záznam (určím ho podmínkou v parametru WhereSys)
pokud dám IdForm=0, ptá se na formulář, jinak přímo vytiskne daným formulářem
vrací True-bylo vytisknuto, False-nebylo


function PrintForm3(BrowseID: Integer; IdForm: Integer; const WhereSys: WideString): WordBool;

zavolá standardní tisk Helios Orange v jiném přehledu než aktuálním (BrowseID - systémové číslo tohoto přehledu), pomocí podmínky v parametru WhereSys určím záznam, který se má vytisknout
pokud dám IdForm=0, ptá se na formulář, jinak přímo vytiskne daným formulářem
vrací True-bylo vytisknuto, False-nebylo


procedure DocasnaTabulkaZOznacenych(const TableName: WideString; Poradi: WordBool);

vytvoří dočasnou tabulku z ID označených záznamů v přehledu. Jméno tabulky si ovlivňuji parametrem TableName. Pokud dám Poradi=True bude v dočasné tabulce ještě sloupce Poradi, ve kterém bude číslo označeného záznamu číslovaný od 1. Pokud mě pořadí nezajímá, doporučujeme dát Poradi=False - bude to o něco rychlejší.

Příklad Typický příklad použití:
Helios.DocasnaTabulkaZOznacenych('#TabOznaceneID', False);
try
.
.
Helios.OpenSQL('SELECT ... '+
'FROM TabXXX AS X '+
'JOIN #TabOznaceneID ON KZ.ID=#TabOznaceneID.ID');
.
.
finally
Helios.ExecSQL('DROP TABLE #TabOznaceneID');
end;


function HeliosVlastnik: IHelios;

tímto rozhraním se mohu dostat do přehledu, nad kterým je aktuální přehled. Může být nil.


tzv. "metainformace" Helios Orange

Všechny níže uvedené funkce vracející metainformace se chovají tak, že pokud není hodnota vybrána, tak se Helios uživatele zeptá (s výjimkou DatumTPV a MaDatumPohl). Metodami SetXXX lze metainformace programově nastavit. Helios nehlídá správnost nastavení (např mohu nastavit neexistující sklad apod).


function Sklad: WideString;
procedure SetSklad(const Sklad: WideString);

vybraný sklad - TabStrom.Cislo VARCHAR(30)


function Sbornik: WideString;
procedure SetSbornik(const Sbornik: WideString);

vybraný druh účetního dokladu (sborník) - TabSbornik.Cislo VARCHAR(3)


function Pokladna: WideString;
procedure SetPokladna(const Pokladna: WideString);

vybraná pokladna - TabDruhPokladen.Cislo VARCHAR(3)


function DatumTPV: TDateTime;
procedure SetDatumTPV(DatumTPV: TDateTime);

vybrané datum, ke kterému chci vidět stav technické přípravy výroby


function Obdobi: Integer;
procedure SetObdobi(Obdobi: Integer);

systémové číslo vybraného období - TabObdobi.Id INT


function MzdObd: Integer;
procedure SetMzdObd(MzdObd: Integer);

číslo vybraného mzdového období - TabMzdObd.IdObdobi INT


function Schranka: WideString;
procedure SetSchranka(const Schranka: WideString);

vybraná schránka pošty - TabEvPSchranky.Cislo VARCHAR(3)


function KategorieKJ: WideString;
procedure SetKategorieKJ(const KategorieKJ: WideString);

vybraná kategorie aktivity (modul CRM) - TabKategKontJed.Cislo VARCHAR(3)


function CU: Integer;
procedure SetCU(CU: Integer);

vrací vybraný celní úřad (modul Celní případy) - TabCLAKon.ID INT


function RadaUctenek: WideString;
procedure SetRadaUctenek(const RadaUctenek: WideString);

řada účtenek v modulu Pokladní prodej


function MaDatumPohl: TDateTime;
procedure SetMaDatumPohl(MaDatumPohl: TDateTime);

datum pohledu do majetku


function IntrUnits: Integer;
procedure SetIntrUnits(IntrUnits: Integer);

Intrastat - zpravodajská jednotka


okna+fonty

function MainApplicationHandle: Integer;

handle na hlavní (neviditelné) okno, které představuje aplikaci (to je specialita Delphi) - někdy tento handle potřebuji kvůli modalitě dialogových oken apod.


function MainApplicationIconHandle: Integer;

handle na ikonu Helios Orange (např. pokud bych chtěl, aby můj formulář měl stejnou ikonu)


function Font: WideString;

jméno fontu, který má uživatel v Helios Orange nastaven. Bylo by žádoucí, aby plugin tento font respektoval (pokud si zákazník nepřeje jinak)


function FontHeight: Integer;

velikost fontu, kterou má uživatel v Helios Orange nastaven. Bylo by žádoucí, aby plugin tuto velikost respektoval (pokud si zákazník nepřeje jinak)


function Charset: Byte;

charset fontu; v tuto chvíli vždy vrací 238=EASTEUROPE_CHARSET, v budoucnu se může povolit i jiné


komunikace s SQL Serverem

procedure ExecSQL(const SQL: WideString);

pošle SQL-příkaz na SQL Server, který nevrací žádný SELECT (nebo vrací, ale hodnoty mě nezajímají)


function OpenSQL(const SQL: WideString): IHeQuery;

pošle SQL-příkaz na SQL Server, který vrací SELECT a k výsledku mohu přistupovat přes obdržené rozhraní IHeQuery (popsáno níže)


zobrazení/editace přehledu

function Prenos( BrowseID: Integer;

const Atribut: WideString;
var Hodnota: OleVariant;
const WhereSys: WideString;
const TitulekOkna: WideString;
AutoSet: WordBool): WordBool;

zobrazí tzv. "přenosový" přehled, kterým mohu uživatele nechat, aby něco vybral

  • BrowseID - číslo přehledu
  • Atribut: WideString - který sloupec (POZOR - nemohu vybírat více sloupců, pokud chci, tak přenesu ID a dalším SELECTem dotáhnu požadované hodnoty)
  • Hodnota: OleVariant - proměnná, ve které mi vrátí vybranou hodnotu (mohu ale i předvyplnit a pokud dám AutoSet=True, tak se mi v přehledu rovnou na tuto hodnotu pokusí najet)
  • WhereSys: WideString - volitelná systémová filtrace
  • TitulekOkna: WideString - co se má zobrazit v titulku okna
  • AutoSet: WordBool -má se Helios pokoušet podle proměnné Hodnota "najet" na záznam?

vrací True, pokud uživatel vybral, False, pokud nevybral nic

Příklad Příklad:
var V: OleVariant;
if Helios.Prenos(1, 'CisloOrg', V, 'TabCisOrg.JeDodavatel=1', 'Vyberte dodavatele', False) then
Helios.Info('Vybraný dodavatel=' + VarToStr(V));


function Prenos2( BrowseID: Integer;

const Atribut1: WideString;
const Atribut2: WideString;
var Hodnota1: OleVariant;
var Hodnota2: OleVariant;
const AWhereSys: WideString;
const TitulekOkna: WideString;
AutoSet: WordBool;
MultiSelect: WordBool;
ReadOnly: WordBool;
PodleKolikaLocate: Integer): WordBool;

podobné jako metoda Prenos(), navíc je možnost předepsat třídění podle jiného sloupce než chci přenášet (parametr Atribut2 - lze ale i použít jako 2. přenášený sloupce - Hodnota2 - pokud nechci, mohu ignorovat), dále MultiSelect - tzn. možnost výběru více než jednoho záznamu (pak se vybraná IDčka vrátí jako String oddělená čárkou). Parametr PodleKolikaLocate je interní záležitost LCS - mělo by být 1.

Příklad Příklad: z číselníku organizací mě zajímají ID-čka, ale přehled chci setřídit podle názvu organizace
var V1, V2: OleVariant;
if Helios.Prenos2(1, 'ID', 'Nazev', V1, V2, '', '', False, True, False, 1) then
Helios.Info('TabCisOrg.IDs=' + VarToStr(V1));


procedure OpenBrowse(BrowseID: Integer; const WhereSys: WideString);

zobrazí uživateli přehled s možností systémové filtrace


procedure EditBrowse(BrowseID: Integer; const WhereSys: WideString);

zobrazí uživateli standardní editor přehledu. Ve WhereSys musí (!) být podmínka, která mi jednoznačně identifikuje záznam, který chci editovat.


zobrazení informativních/chybových hlášek

procedure Info(const Msg: WideString);

standardní informativní hláška Helios Orange


procedure Error(const Msg: WideString);

standardní chybová hláška Helios Orange


function YesNo(const Msg: WideString; DefaultYes: WordBool): WordBool;

standardní dialog Ano / Ne Helios Orange. Vrací True=Ano, False=Ne.


function YesNoCancel(const Msg: WideString; DefaultYes: WordBool): Byte;

standardní dialog Ano / Ne / Storno Helios Orange. Vrací konstanty Windows (v Delphi unita Windows.pas): IDYES=6, IDNO=7, IDCANCEL=2.


info o přihlášeném uživateli

function LoginName: WideString;

přihlašovací jméno přihlášeného uživatele (stejnou hodnotu bych dostal via SELECT SUSER_SNAME())


function FullName: WideString;

plné jméno přihlášeného uživatele


function UserId: Smallint;

číslo přihlášeného uživatele - používá se do mechanismu TabXXXX.BlokovaniEditoru - (TabUserCfg.ID - POZOR TabUserCfg je jen v nulté databázi)


function HeVersion: Largeuint;

verze Helios Orange hexadecimálně (dostanu také přes SELECT VerzeEXE FROM TabHGlob) používá se takto na začátku metody Run():

const JakouMinimalniVerziHeliosuPluginPodporuje = $010020061010; //=1.0.2006.1010
 
if Helios.HeVersion<JakouMinimalniVerziHeliosuPluginPodporuje then
raise Exception.Create('Plugin vyžaduje min verzi Heliosu '
+ IntToHex(JakouMinimalniVerziHeliosuPluginPodporuje, 12));


function SQLVersion: Integer;

verze SQL Serveru hexadecimálně


function Language: Byte;

jazyk Helios Orange aktuálně přihlášeného uživatele

  • 0=Česky (bez diakritiky)
  • 1=Česky (s diakritikou)
  • 4=Slovensky
  • 6=English
  • 7=Deutsch
  • 8=Chorvatsky
  • 9=Polski
  • 10=Romania
  • 11=Español

seznam se v budoucnu může rozšířit


function SystemDB: WideString;

vrací název systémové (nulté) databáze (databáze, kde jsou platné tabulky TabUserCfg, TabDBHelios a TabSetup)


info o veřejných jménech

function AttrPublicName(const TableDotAttr: WideString): WideString;

vrací veřejné jméno sloupce TableDotAttr. Když nenajde, vrací ''


function Konverze(const TableDotAttr: WideString): WideString;

vrací tzv. Konverzi. U některých sloupců je v databázi uloženo něco jiného než se zobrazuje uživateli - příklad pro TabDokladyZbozi.DruhPohybuZbo vrací text:

  • 0=Příjem
  • 1=Storno příjmu
  • 2=Výdej

když nenajde, vrací ''


informace o licenci

function IHelios.SerNum: WideString;

sériové číslo instalace


function IHelios.MaxNumDBs: Integer;

maximální počet firem instalace


function IHelios.MaxNumUsers: Integer;

maximální počet uživatelů instalace


IHeQuery = interface(IUnknown)

function FieldValues(Field: Integer): OleVariant;

vrací hodnotu v resultsetu pro sloupec číslo Field (číslováno od 0) - indexování číslem je rychlejší než jménem - FieldByNameValues

Upozornění POZOR vrací OleVariant a může vracet hodnotu NULL


function FieldByNameValues(const FieldName: WideString): OleVariant;

vrací hodnotu v resultsetu pro sloupec s názvem FieldName

Upozornění POZOR vrací OleVariant a může vracet hodnotu NULL


procedure Next;

jde na další řádek resultsetu (zajímá mě, jen pokud SELECT vrací víc než jednu řádku)


function EOF: WordBool;

říká, jestli jsem na posledním řádku resultsetu (zajímá mě, jen pokud SELECT vrací víc než jednu řádku)

Příklad Příklad:
var Q : IHeQuery;
Q := Helios.OpenSQL('SELECT name FROM master.dbo.sysdatabases ORDER BY 1');
while not Q.EOF do begin
Memo1.Lines.Add(Q.FieldValues(0));
Q.Next;
end;


procedure Prev;

přechod na předchozí záznam


procedure First;

přechod na první záznam


function RecordCount: Integer;

počet řádků v resultsetu


function FieldCount: Integer;

počet sloupců v resultsetu


function Fields(Index: Integer): IHeQueryField;

přístup k jednotlivým fieldům (sloupcům) přes rozhraní indexem


function FieldByName(const FieldName: WideString): IHeQueryField;

přístup k jednotlivým fieldům (sloupcům) přes rozhraní jménem - pokud nenajde zahlásí chybu (výjimka)


function FindField(const FieldName: WideString): IHeQueryField;

přístup k jednotlivým fieldům (sloupcům) přes rozhraní jménem - pokud nenajde vrátí nil


function Locate(const KeyFields: WideString; KeyValues: OleVariant): WordBool;

hledá podle zadaných sloupců (parametry jako IHelios.Locate)


function BOF: WordBool;

říká, jestli jsem na prvním řádku resultsetu


IHeQueryField = interface(IUnknown)

function FieldName: WideString;

systémové jméno sloupce


function DisplayName: WideString;

veřejné jméno sloupce


function Value: OleVariant;

hodnota jako VARIANT


function Visible: WordBool;

je sloupec veřejný? (tzn. je vidět v přehledu nebo je jen součástí SELECTu a používá se skrytě?)


Registrované pluginy

Nyní jsou všechny pluginy registrované (potřebují ke svému běhu instalační kód uložený v souboru RegPlugin.ini). Tuto metodu tedy není potřeba volat.


Speciální pluginy (= pluginy s instalačním procesem)

Z pluginu musí být exportována funkce s přesně takovou hlavičkou:

function PluginGetSysAndClassName(Vysl: PChar): DWORD; stdcall;

Funkci volá Helios Orange dvakrát:

  • poprvé (Vysl=nil) by měla vrátit délku (v příštím volání) vráceného řetězce (aby Helios věděl, jak velký buffer má naalokovat); v tomto případě do Vysl nic nezapisovat (jinak by to spadlo)
  • podruhé (Vysl<>nil), by měla do bufferu Vysl: PChar zapsat ProgID COM pluginu a znovu vrátiti délku PCharu


Typická implementace vypadá takto:

function PluginGetSysAndClassName(Vysl: PChar): DWORD; stdcall;
const C_ProgID = 'PluginXXX.ExportYYY';
begin
Result := Length(C_ProgID);
if Assigned(Vysl) then
StrPCopy(Vysl, C_ProgID);
end;

Klauzuli exports v projektovém souboru .DPR musíme ručně rozšířit takto:

exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer,
PluginGetSysAndClassName;


V přehledu Externí akce je v místním menu přehled Speciální pluginy a tam je možno přes Nový najít plugin DLL a vybrat. Pokud je v DLL nalezena výše uvedená funkce, tak se návratová hodnota rozdělí na systémové jméno a jméno objektu a tyto se zapíší do TabPluginInfo a plugin se spustí s IDExtKom = -1. Další položky tabulky (NazevVerejny, VerzePluginu a ZmenyOK) jsou již v režii pluginu.

Pokud je plugin zavolán s IDExtKom = -2, je tím myšleno zobrazení info "O Pluginu…"

Akce "Instalace" a "O pluginu…" v přehledu pluginů vezmou systémové jméno a jméno objektu, vloží mezi ně tečku a spustí plugin s IdExtKom = -1 nebo -2.

Instalace by měla být naprogramována tak, aby byla spustitelná vícekrát za sebou a nezhroutila se.

Osobní nástroje
Jmenné prostory
Varianty
Akce
Navigace
dokumentace orange
dokumentace easy
společné návody a tipy
interní dokumentace
Nástroje
další nástroje
Tisk/export