scriptFor

7.14
scriptFor è un API di interpretazione di script e formule.
E' utile per inserire in piccoli script, formule matematiche (ma anche di comparazione di stringhe) o condizioni esterne all'esecutivo "da interpretare".
Questo per permettere di condizionare scelte senza ricompilare il codice.
Si sposta parte del sistema "condizionato e decisionale" al di fuori del programma esecutivo e in modo renderlo parametrico come un qualunque altro dato e memorizzato (ad esempio) in una tabella di un db.
E' usato in tutti i casi dove è difficile prendere anticipatamente decisioni sulla base flag o liste o dove non si sa, nel momento della stesura dell'applicativo, quali condizioni saranno applicate, ma solo i dati sulle quelli lavoreranno.

Prendiamo ad esempio di dover elaborare una condizione e di dare la possibilità all'utente di poterla cambiare come vuole elencandogli le variabili possibili:

(QTA>10 && FATTURATO>1000)

scriptFor fa il parser logico della una stringa (formula) restituendo il risultato.
Attraverso una "funzione di notifica esterna" richiede il valore delle variabili e funzioni che non conosce.

Ritorna anche eventuali errori di sintassi se la formula non è corretta.

Esempio di gestione di una condizione

#include "/easyhand/inc/scriptFor.h"

	S_SCRIPT sScript, *psScript;
	S_UNIVAL *	psRet;
	CHAR * pszVal="(QTA>10 OR FATTURATO>1000)";
	_(sScript);
	sScript.funcExt=_scriptNotify; // Funzione di controllo
//	sScript.bVerbose=false; // Mostra i passaggi di elaborazione
	psScript=scriptCreate(&sScript);

	psRet=scriptGetValue(psScript,pszVal);
	if (psScript->enError||!psRet) {
		_addErr("Condizione errata [%s]",pszVal);
		iRet=2;
	}
	
	if (psRet)
	{
		// ->dValue contiene il risultato
		if (psRet->dValue) iRet=0; else iRet=1;
		valDestroy(psRet);
	} 
	psScript=scriptDestroy(psScript);
		
.
.
.
static void * _scriptNotify(S_SCRIPT * psScript,EN_MESSAGE enMess,CHAR * pszToken,void * pVoid)
{
	S_UNIVAL  * psVal=NULL;
	CHAR * p;
	void * pRet=NULL;

	switch (enMess) {

		//
		// LETTURA VARIABILE
		//
		case WS_REALGET:
			// Cerco il valore (con un mio sistema) della variabile richiesta	
			p=coupleGet(_l.cpVal,pszToken); // pszToken = Nome della variabile
			if (p) {
				if (!strcmp(pszToken,"PESONETTO")||
					!strcmp(pszToken,"PESONETTO_IMP")||
					!strcmp(pszToken,"PESOUN")||
					!strcmp(pszToken,"PZCOLLO")
					
					) {
					pRet=psVal=valCreateNumber(atof(p));
				} else {
					pRet=psVal=valCreateText(p);
				}
			}
			break;

		//
		// SCRITTURA 
		//
		case WS_REALSET: // Settaggio di un valore (tipicamente una variabile)
			ehError();
			break;
  }

  return pRet; // Errore
}
	

See also:
Easyhand C/C++: scriptFor | Last modified: 24/06/2016 09.47.58 Europe/Rome | #1.2527
P.. 1372
Page Visible: as draft
Easyhand C/C++
Una mano alle tue idee.
|
Privacy Policy