Segue un esempio di come realizzare una tabella (report) con il powerDoc.
I passi per realizzare un report sono i seguenti
Crezione del documento
Attraverso il preset iniziale dei parametri è possibile definire le caratteristiche generali del documento ed il suo layout.
Se si desidera intervenire sul report in modo
personalizzato si può usare la funzione esterna di notifica che viene invocata per l'header, body e footer di ogni pagina.
EH_PWD * psPower;
psPower=PowerDoc(WS_CREATE,PUM_MM,NULL);
// psPower->funcNotify=pwdFuncExt; (Vedi sotto funzione di notifica)
psPower->enCharEncode=SE_ANSI;// ANSI "UTF-8"
strcpy(szServ,progenesiTemp("Powerdoc"));
psPower->pszTempFolder=strDup(szServ);//"c:\\Progenesi\\Temp\\Powerdoc";
if (!fileCheck(psPower->pszTempFolder)) dirCreate(psPower->pszTempFolder,NULL);
psPower->pszDeviceDefine=_s.pszPrinterDefine;
psPower->enLayStyle=PWD_LAYTYPE1; // Tipo di Layout
psPower->umHeadHeight=pwdUm(PUM_STD,200); // Altezza dell'header
psPower->umFootHeight=pwdUm(PUM_STD,50);
psPower->umRowHeight=pwdUm(PUM_STD,35); // 53 Altezza di una linea
psPower->umTitleHeight=pwdUm(PUM_STD,40); // Altezza della descrizione del campo
psPower->fLineHorzField=true;
psPower->pszFontTitleDefault="Tahoma"; // Font del titolo
psPower->pszFontBodyDefault="Arial";//Times New Roman"; // Font del corpo
psPower->rumMargin.left=pwdUm(PUM_MM,3);
psPower->rumMargin.top=pwdUm(PUM_MM,3);
psPower->rumMargin.right=pwdUm(PUM_MM,3);
psPower->rumMargin.bottom=pwdUm(PUM_MM,3);
psPower->fDate=true; // Visualizza la data in stampa
psPower->fPag=true; // Visualizza il numero di pagina ( in basso a destra)
//
Definizione delle colonne
Questa sezione definisce
una tantum il formato dei dati e le colonne della tabella in stampa.
pwdColBegin();
pwdColAdd(ALFA,PDA_CENTER,8.0, "Data");
pwdColAdd(ALFA,PDA_LEFT,8.0, "Lotto");
pwdColAdd(ALFA,PDA_LEFT,6.0, "Codice");
pwdColAdd(ALFA,PDA_LEFT,0.0, "Descrizione");
pwdColAdd(ALFA,PDA_CENTER,3.0, "Mag");
pwdColAdd(ALFA,PDA_LEFT, 16.0, "Causale");
pwdColAdd(ALFA,PDA_CENTER,5.0, "Ciclo");
pwdColAdd(ALFA,PDA_RIGHT,5.0, "Um");
psField=(PWD_FIELD * ) pwdColAdd(NUME,PDA_RIGHT,8.0,"Quantità");
psField->iDec=sSetup.iDecimali;
psField->fSep=true;
pwdColEnd();
Popolare la tabella con i dati
Di seguito un esempio di come popolare i dati con
pwdSet e
pwsSetEx sql_query("%s",pszQuery);
rsSet=sql_store();
while (sql_fetch(rsSet)) {
double dValore;
pwsRowBegin(); // <-- Inizio riga
pwdSet(0,dateFor(sql_ptr(rsSet,"DATAMOVI"),"/")); // Data
pwdSet(1,sql_ptr(rsSet,"CODBA")); // Lotto
pwdSet(2,sql_ptr(rsSet,"MAGART")); // Magazzino
pwdSet(3,sql_ptr(rsSet,"DEPAR")); // Descrizione
.
.
.
dValore=sql_num(rsSet,"QTA")*iSegno;
pwdSetEx(8,&dValore,(iSegno<0)?PDC_RED:PDC_BLACK,PDC_TRASP,STYLE_NORMAL,PDA_RIGHT);
pwdRowEnd(); // <-- Fine riga
}
sql_free(rsSet);
Conclusione Preview e Stampa
PowerDoc(WS_CLOSE,true,"View");
L'esempio usa funzioni e macro recenti, ma i vecchi sorgenti che usano solo PowerDoc() sono compatibili con il sistema.
Notifica
void * fatNotify(EN_MESSAGE enMess, LONG info,void *ptr)
{
PWD_NOTIFY * psNotify=(PWD_NOTIFY *) ptr;
switch (enMess) {
case WS_DO:
psNotify=ptr;
switch (psNotify->enType)
{
//
// Intestazione della pagina | Invocazione in apertura pagina
//
case PDN_HEAD:
fatHeaderPage(psNotify);
break;
//
// Stampa del piede del documento
//
case PDN_FOOT :
fatFooterPage(psNotify);
break;
}
break;
}
return NULL;
}