El_gringo | Le contexte est le suivant :
J'ai une appli qui rempli une table de log.
On veut permettre à l'utilisateur de consulter cette table depuis l'interface de mon appli.
Mais cette table est généralement énorme, donc afficher tous les les enregistrements prendrait un temps énorme.
un des champ de ma table de log est MSGID. ce champ identifie le type de message d'un enregistrment.
J'ai donc opté pour la solution suivante :
offrir la possibilité de définir un filtre sur ce MSGID, sachant que :
| veut dire que la valeur suivante est également visualisable.
- représente un interval de valeurs visualisables.
par exemple le filtre "5000-5999|6001" autorise la visualisation des messages dont le MSGID est compris entre 5000 et 5999, plus ceux dont le MSGID est 6001.
Je pensait que l'algo serait assez simple, mais je suis en train de rajouter tout un tas de cas particuliers, je m'en sort pas. Pour l'instant, mon algo en est là (c'est codé en C) :
Je commence par séparer les 2 types d'éléments : opérateurs '-' et '|', et chiffres. Je stocke tous les opérateurs dans un tableau, et tous les chiffres dans un autre.
ensuite, mon algo en est là :
Code :
- char szPartToAdd[32]; // Partie de clause where à ajouter
- char curentOp = '\0'; // Opérateur courant
- char nextOp = '\0'; // Opérateur précédant
- long lPrevMSGID = '\0'; // MSGID précédant l'opérateur courant
- long lNextMSGID = '\0'; // MSGID suivant l'opérateur courant
- BOOL bFirstCondition = TRUE;
- BOOL bColNameWrited = FALSE;
- if (lNbOp == 0)
- {
- memset (szPartToAdd, 0, sizeof (szPartToAdd));
- sprintf (szPartToAdd, "MSGID = %ld", lplAllMSGID[0]);
- strcat (szWhereClause, szPartToAdd);
- }
- else
- {
- for (lCpt = 0; lCpt <= lNbOp; lCpt++)
- {
- memset (szPartToAdd, 0, sizeof (szPartToAdd));
- if (!bColNameWrited)
- {
- if (bFirstCondition)
- {
- strcat (szWhereClause, "MSGID " );
- bFirstCondition = FALSE;
- }
- else
- strcat (szWhereClause, "OR MSGID " );
- bColNameWrited = TRUE;
- }
- curentOp = szAllOp[lCpt];
- nextOp = szAllOp[lCpt+1];
- lPrevMSGID = lplAllMSGID[lCpt];
- lNextMSGID = lplAllMSGID[lCpt+1];
- if (curentOp == '-')
- {
- sprintf (szPartToAdd, "BETWEEN %ld AND %ld ", lPrevMSGID, lNextMSGID);
- bColNameWrited = FALSE;
- }
- else if (curentOp == '|')
- {
- if (lCpt == 0)
- {
- sprintf (szPartToAdd, "= %ld ", lPrevMSGID);
- bColNameWrited = FALSE;
- }
- else if ((lCpt == lNbOp) || (nextOp == '|'))
- {
- sprintf (szPartToAdd, "= %ld ", lNextMSGID);
- bColNameWrited = FALSE;
- }
- else
- {
- continue;
- }
- }
- strcat (szWhereClause, szPartToAdd);
- }
- }
|
Bref, un 'ti coup de main serait le bienvenu ! |