Esempio di personalizzazione dell'anagrafica articoli di magazzino

Da SIGLAkb.

Dp-ingranaggio3.png SIGLA® consente di operare l’aggiunta di campi di input su alcune delle finestre di dialogo gestite. I campi di input aggiuntivi possono essere normali (la gestione della memorizzazione e del recupero dal database sono in questo caso interamente demandate a funzioni personalizzate) o automatici.

I campi automatici consentono di operare delle aggiunte di informazione che vengono automaticamente memorizzate e recuperate nelle tabelle del database.

L’operazione avviene definendo in un file ASCII, il cui nome varia in funzione della finestra che si desidera personalizzare, un insieme di istruzioni in grado di descrivere i campi da aggiungere.

Dp-Pointing256.png Per i dettagli vedi la voce Personalizzazione delle finestre.


Supponendo, ad esempio, di voler aggiungere tre campi automatici (una data, un numero e un testo) all'anagrafica degli articoli di magazzino, è necessario generare con un comune editor, come il Blocco note, il file ASCII ANAMAG.USR definito come segue:

 
 
 ;definizione della label del Folder Aggiuntivo
 LNote
 ; definizione di un riquadro nel Folder Aggiuntivo
 A02025009
 ; definizione delle didascalie
 T0303Data
 T0305Importo
 T0307Descrizione
 ; definizione dei campi d’immissione
 DD08020031USRDATA
 DN13220051USRIMPORTO
 DT20020071USRDESCR XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 


Il file ANAMAG.USR deve essere posizionato nella cartella di installazione di SIGLA®.

Dp-acceptn72x72.png I nomi dei campi devono lunghi 11 caratteri, quindi nel file devono essere scritti con spazi bianchi di riempimento a destra fino al raggiungimento di tale lunghezza.


La struttura della tabella ANAMAGA nel database dei dati aziendali deve essere ovviamente modificata con l'aggiunta dei tre campi

  • USRDATA char(8)
  • USRIMPORTO numeric
  • USRDESCR char(20)

Questa operazione può essere effettuata attraverso gli appositi strumenti di amministrazione messi a disposizione dai vari database manager e, per la fase di creazione delle tabelle attraverso il programma di Configurazione implementando la funzione SIGLAPPCreateDitta.

La figura 1 mostra come si presenta usualmente la finestra di dialogo senza alcuna personalizzazione.

Figura 1: Anagrafica articoli di magazzino

La figura 2 invece mostra l'aspetto della stessa finestra con la personalizzazione.

Figura 2: Pagina Note nell'anagrafica articoli di magazzino


All'interno dell'anagrafica è stata aggiunta una nuova pagina denominata Note, nella quale sono contenuti i dati aggiuntivi richiesti (data, importo e descrizione).

I nuovi campi inseriti sono abilitati all'input da parte dall’utente e, in quanto campi automatici, la gestione memorizzazione delle informazioni è gestita da SIGLA®.
In fase di salvataggio di un record le informazioni inserite nei campi a video sono memorizzate nei campi aggiuntivi precedentemente inseriti nella tabella ANAMAGA.
In fase di consultazione di un record esistente le informazioni mostrate a video sono automaticamente reperite da tali campi.

Fino a questo punto tutte le operazioni di personalizzazione sono state completate senza la scrittura di codice, le successive fasi invece fasi prevedono la scrittura di codice per l'utilizzo della libreria SIGPPDLL/SPPFrame.

Supponendo di voler aggiungere un controllo sul campo Data in modo da verificarne la validità, si deve intervenire implementando la funzione SIGLAPPSaveObject, come mostrato nel seguito (nell'esempio si prevede di eseguire il controllo attraverso una specifica funzione realizzata in una DLL aggiuntiva chiamata custom.dll, caricata nella SIGLAPPStart, inizializzata nella SIGLAPPInit e rilasciata nella SIGLAPPStop).

 
 
 BOOL DLLCALL SIGLAPPSaveObject(DPObject *theObject,int theActionID)
 {
  DPUsrFld *param;
  char buffer[128];
 
  if(theActionID==-1000)
  {
  param=(DPUsrFld *) theObject;
 
  // controlla il nome della finestra
  if(strcmp(param->videoname,”ANAMAG”)==0)
  {
  switch(param->actualfld)
  {
  // controlla il campo 0 (data)
  case 0:
  // torna FALSE se la data non è valida
  {
  int ret;
  int (FAR PASCAL *ValidateDate) (LPSTR xdate);
  FARPROC pp;
 
  if(customdll>HINSTANCE_ERROR)
  {
  pp=GetProcAddress(customdll,"VALIDATEDATE");
  if(pp!=NULL)
  {
  // il controllo di validità della data viene eseguito
  // da una funzione della libreria custom.dll
  strcpy(buffer,param->usrfld[0]);
  ValidateDate=(void (FAR PASCAL *)()) pp;
  ret=(*ValidateDate)(buffer);
 
  if(ret==0) {
  // la data è valida e viene copiata in usrfld[0] in
  // modo da essere aggiornata a video
  strcpy(param->usrfld[0],buffer);
  return(TRUE);
  }
  else return(FALSE);
  }
  }
  }
  }
  }
  return TRUE;
 }
 


Dp-editn72x72.png Le chiamate con actionid -1000 possono essere attivate anche per SPPFrame ed intercettate nella funzione SPPFrameIntSaveObject della libreria SPPFrOld. Per l'attivazione è necessario implementare l'actionid -999 nella funzione SPPFrameIntSaveObject in maniera che il valore di ritorno della funzione sia False.

Se non si implementa l'actionid -999 per la SPPFrameIntSaveObject o se il ritorno è True le successive uscite -1000 continueranno ad essere indirizzate alla SIGPPDLL.DLL.


Le informazioni personalizzate aggiunte alla finestra di dialogo dell'anagrafica degli articoli di magazzino possono essere utilizzate anche in altre parti della procedura come, ad esempio, la stampa di una bolla.

Configurando il CAMPO PERSONALIZZATO SU ANAMAGA durante la fase di impostazione del fincato del documento per le stampe testo, oppure accedendo alla pagina Controllo e selezionando l'opzione ANAMAGA per le stampe grafiche (vedi figure 3 e 4 sotto) è possibile esporre in stampa anche queste informazioni aggiunte alla tabella ANAMAGA.

Figura 3: Campo personalizzato su ANAMAGA - stampa testo

Figura 4: Disegno stampa grafica

Personalizzazione SppFrame

Di seguito riportiamo il codice Delphi. Per eseguire la stessa personalizzazione utilizzando il sistema di sviluppo Sppframe.

 
 
 function SPPFrameIntSaveObject(theObject: pointer;
  theActionId: LongInt): boolean; export; stdcall;
 var
  fldvalue,
  videoname: string;
  actual_field: integer;
 begin
  Result := true;
  case theActionId of
  -999: Result := False; //Abilita l'intercettazione delle
  //chiamate con ActionId -1000
  -1000:
  begin
  videoname := theDispatcher.GetFieldValue(theObject,'videoname');
  if videoname = 'ANAMAG' then begin
  actual_field := StrToInt(
  theDispatcher.GetFieldValue(theObject,'actualfld')
  );
  case actual_field of
  0: begin // Uscita dal primo campo (data)
  fldvalue := theDispatcher.GetFieldValue(theObject,'C000')
  if not ValidateDate(fldvalue) then
  Result := False; // La validazione non ha avuto
  // esito positivo;
  end;
  end;
  end;
  end;
  end;
 end;
 

Bibliografia

Voci correlate

Anagrafica degli articoli
Come si personalizza SIGLA
Configurazione
La libreria SIGPPDLL
La libreria SPPFrame
Personalizzazione delle finestre
SIGLAPPCreateDitta
Stampe testo