Caractéristiques de l'implémentation de listes dynamiques dans les interfaces utilisateur

image

L'interface de chaque application moderne sous une forme ou une autre contient des listes d'objets. Lorsqu'il travaille avec eux, l'utilisateur a souvent besoin du mĂȘme type d'actions comme le tri, le filtrage, l'exportation, etc. La mise en Ɠuvre de ces opĂ©rations est souvent compliquĂ©e par le fait que les listes peuvent ĂȘtre «dynamiques». Dans ce cas, les donnĂ©es seront lues si nĂ©cessaire non seulement du serveur au client, mais Ă©galement du serveur de base de donnĂ©es au serveur d'applications.

Dans la plate - forme lsFusion ouverte et gratuite , toutes les listes sont dynamiques par défaut et sont ajoutées à n'importe quel formulaire en quelques lignes de code. Dans cet article, je vais vous donner quelques détails techniques sur leur implémentation, ainsi que les fonctionnalités de l'interface qui sont automatiquement fournies à l'utilisateur lorsqu'il travaille avec n'importe quelle liste sur n'importe quel formulaire.

La création


Les listes du formulaire dans lsFusion sont ajoutées par l'instruction OBJECTS :
OBJECTS i = Item
Un tableau sera ajouté au formulaire, dans lequel tous les objets de la classe Item seront contenus dans les lignes. Vous pouvez ajouter plusieurs objets à une seule liste. Par exemple
OBJECTS (i = Item, s = Stock)
Dans ce cas, le tableau affichera toutes les paires possibles d'objets des classes Article et Stock .

Des colonnes sont ajoutées à la liste avec l'instruction PROPERTIES :
PROPERTIES name(i), name(s), quantityOnHand(i, s)
Dans le tableau, vous pouvez ajouter des détails simples sur l'objet, ainsi que toutes les expressions avec regroupements, partitionnement, récursivité, etc.

Par défaut, la liste affichera tous les objets de la base de données. Pour les limiter, vous pouvez utiliser l' instruction FILTERS :
FILTERS quantityOnHand(i, s) > 0
Dans la condition de filtre, vous pouvez utiliser n'importe quelle expression qui dépend des objets du formulaire.

La navigation


Lorsque l'utilisateur ouvre le formulaire, la plateforme dĂ©termine automatiquement le nombre d'enregistrements visibles en fonction de la taille de la table. Pour des raisons de simplicitĂ© de prĂ©sentation, nous supposons qu'il existe 50 enregistrements de ce type et Ă  chaque instant, la plateforme stockera 150 enregistrements sur le client et sur le serveur. Dans ce cas, l'objet actif courant doit se trouver au milieu de cette «fenĂȘtre»: du 50e au 99e enregistrement. Il peut y avoir moins d'entrĂ©es si l'objet actuel se trouve au tout dĂ©but ou Ă  la fin de la liste.

Si vous devez activer un enregistrement spĂ©cifique lorsque vous ouvrez le formulaire, deux demandes sont envoyĂ©es au serveur de base de donnĂ©es, chacune lisant 75 enregistrements de chaque cĂŽtĂ© de l'enregistrement souhaitĂ©. Ensuite, une liste gĂ©nĂ©rale est collĂ©e Ă  partir de leurs rĂ©sultats. Dans le cas oĂč vous devez initialiser la liste depuis le dĂ©but ou la fin, une demande est effectuĂ©e pour 100 enregistrements et le premier ou le dernier enregistrement reçu est activĂ©. La mĂȘme chose se produit si l'utilisateur appuie sur CTRL + ACCUEIL ou CTRL + FIN dans la liste pour aller au dĂ©but ou Ă  la fin de la liste.

DĂšs que l'utilisateur effectue un enregistrement actif en dehors du milieu de la fenĂȘtre en cours (avant le 50e ou aprĂšs le 99e), la plate-forme lit des enregistrements supplĂ©mentaires afin que l'enregistrement en cours soit au "centre" mĂȘme de la nouvelle fenĂȘtre.

La particularitĂ© d'une telle implĂ©mentation de liste dynamique est que l'objet actuel ne peut pas ĂȘtre en dehors du milieu de la fenĂȘtre. Par consĂ©quent, lors du dĂ©filement de la liste, l'objet actuel est automatiquement dĂ©placĂ© vers la zone visible.
image


La lecture de donnĂ©es dans une liste se produit toujours dans deux requĂȘtes. La premiĂšre requĂȘte lit uniquement les clĂ©s des enregistrements nĂ©cessaires dans la table temporaire. La deuxiĂšme requĂȘte lit les valeurs de toutes les colonnes pour les clĂ©s dĂ©jĂ  lues. Cela est dĂ» au fait que les colonnes peuvent contenir toutes les expressions qui peuvent ĂȘtre compilĂ©es en sous-requĂȘtes ou autres constructions SQL complexes. Dans ce cas, la plateforme elle-mĂȘme pousse ces clĂ©s dans des sous-requĂȘtes afin que le calcul des valeurs de ces colonnes ne passe pas sur l'ensemble de la base de donnĂ©es, mais uniquement en fonction des clĂ©s nĂ©cessaires. Cela crĂ©e un lĂ©ger surcoĂ»t, car deux requĂȘtes sont effectuĂ©es au lieu d'une, mais il protĂšge contre les «accĂšs» accidentels Ă  un plan de serveur de base de donnĂ©es inefficace.

Filtrage


Les entrĂ©es de la liste du formulaire peuvent ĂȘtre filtrĂ©es en fonction des options suivantes:

  • Indication dans le code de sĂ©lection continue Ă  l'aide de l'instruction FILTERS:
    FILTERS <>
    L'expression peut dépendre de tout autre objet actuellement sélectionné sur le formulaire. Par exemple, s'il y a un tableau ou une arborescence avec un entrepÎt sur le formulaire, alors dans l'expression de la liste des marchandises, vous pouvez vous référer à l'entrepÎt en cours pour filtrer uniquement les marchandises qui sont en solde.
  • Indication dans le code de sĂ©lection, qui peut ĂȘtre appliquĂ©e par l'utilisateur selon les besoins Ă  l'aide de l'instruction FILTERGROUP :
    FILTERGROUP myFilters
    FILTER 'Filter 1' <expression> 'F5' DEFAULT
    FILTER 'Filter 2' <expression> 'F6'

    Une liste déroulante sera ajoutée au formulaire (ou une case à cocher s'il y a un filtre dans le groupe), avec laquelle l'utilisateur peut sélectionner l'un des filtres à appliquer.
    image
  • Filtrage personnalisĂ© manuellement effectuĂ© par l'utilisateur dans l'interface:
    image
    Si la colonne de la liste n'est pas modifiable, lors de la saisie des caractĂšres, le filtre de cette colonne sera automatiquement activĂ©, ce qui peut ĂȘtre rĂ©initialisĂ© par une simple pression sur la touche ESC.

La plateforme elle-mĂȘme surveille les changements dans toutes les conditions qui peuvent affecter le filtre actuel (changement d'objets dĂ©pendants, actions de l'utilisateur, etc.). Lorsque de tels changements sont dĂ©tectĂ©s, la liste est automatiquement mise Ă  jour sans modifier l'objet actuellement sĂ©lectionnĂ©. Pour ce faire, deux requĂȘtes sont effectuĂ©es, 75 entrĂ©es dans chaque sens par rapport Ă  la prĂ©cĂ©dente, ainsi que lors de l'initialisation du formulaire.

Tri


Par dĂ©faut, les entrĂ©es des listes sont triĂ©es par ordre croissant des identifiants internes des objets. Ces identifiants sont gĂ©nĂ©rĂ©s automatiquement dans l'ordre croissant lors de la crĂ©ation d'objets (en mĂȘme temps, ils sont globalement uniques dans toutes les classes), et les index sont toujours construits sur eux.

Le tri dans la liste peut ĂȘtre modifiĂ© comme suit:

  • En indiquant dans le code les colonnes par lesquelles le tri est effectuĂ© via l'instruction ORDER :
    ORDER column1(o) DESC , column2(o)
  • Double-cliquez sur l'en-tĂȘte de colonne par l'utilisateur (en maintenant CTRL ajouter le tri "imbriquĂ©").
    image

Selon le tri en cours, lors de la lecture des clĂ©s d'enregistrement, les expressions de colonne correspondantes seront ajoutĂ©es au bloc ORDER BY de la requĂȘte. Dans le mĂȘme temps, l'identifiant unique du ou des objets est toujours ajoutĂ© au tri pour garantir que les clĂ©s de tous les enregistrements sont uniques.

Une expression de la forme: colonne1> valeur1 OU (colonne1 = valeur1 ET colonne2> valeur2) OU (colonne1 = valeur1 ET colonne2 = valeur2 ET clé> valeur) sera ajoutée à la clause WHERE de la demande. De plus, lors de la lecture des clés, l'instruction LIMIT avec le nombre requis d'enregistrements lisibles sera ajoutée à la demande. Lors de la lecture des enregistrements «up», l'ordre dans ORDER BY et l'expression dans WHERE seront «inversés» en conséquence pour lire les enregistrements dans la direction opposée.

Il convient de noter que la complexitĂ© de l'exĂ©cution de ces requĂȘtes sera relativement faible s'il existe un index appropriĂ© (puisque l'index sera le kilomĂ©trage Ă  partir de la clĂ© actuelle vers le haut ou vers le bas uniquement pour un nombre donnĂ© d'enregistrements). Par consĂ©quent, pour accĂ©lĂ©rer le travail avec la liste dynamique lors du tri par colonnes colonne1, colonne2, il est recommandĂ© de crĂ©er l'index suivant:
INDEX column1(Object o), column2(o), o;
Si le tri est basĂ© sur la colonne calculĂ©e, il peut ĂȘtre stockĂ© de maniĂšre permanente, comme dĂ©crit dans cet article , puis un index peut ĂȘtre construit sur celui-ci.

L'une des caractĂ©ristiques d'une telle implĂ©mentation est l'absence d'une barre de dĂ©filement «honnĂȘte». Lors de la lecture des enregistrements, seul le nombre nĂ©cessaire d'entre eux est lu. Une demande pour obtenir le nombre total de lignes dans la liste via COUNT (*) avec le filtre souhaitĂ© peut conduire Ă  une exĂ©cution complĂšte sur la table ou l'index, ce qui affectera nĂ©gativement les performances. Le mĂȘme problĂšme se produit lors de la lecture des enregistrements via la construction OFFSET. En outre, il convient de garder Ă  l'esprit que lors de la navigation dans une liste, le nombre d'entrĂ©es qu'elle contient peut ĂȘtre modifiĂ© par d'autres utilisateurs en effectuant de nouvelles modifications.

Édition


Étonnamment, sur certaines plates-formes, mĂȘme commerciales, ils ne pouvaient pas rĂ©aliser la possibilitĂ© de modifier des listes dynamiques. La principale difficultĂ© de mise en Ɠuvre de ce mĂ©canisme est que seule la fenĂȘtre visible est stockĂ©e sur le serveur et le client, et des modifications peuvent ĂȘtre apportĂ©es dans la liste entiĂšre.

Il n'y a pas de mécanisme spécifique dans lsFusion qui implémente l'édition de liste directement. Cette fonctionnalité est implémentée dans le cadre du mécanisme de session générale.

Toutes les modifications apportĂ©es dans la session de modification en cours sont stockĂ©es dans des tables temporaires. Lorsque l'utilisateur modifie quelque chose sur le formulaire (y compris la valeur dans l'une des entrĂ©es), les nouvelles valeurs sont Ă©crites dans des tables temporaires avec les clĂ©s appropriĂ©es. Ensuite, lorsque la deuxiĂšme requĂȘte (aprĂšs rĂ©ception des clĂ©s) lit les valeurs des colonnes, le JOIN avec les tables temporaires correspondantes avec modifications est simplement ajoutĂ© Ă  la requĂȘte.

Lors de l'enregistrement de la session de modification, une requĂȘte est exĂ©cutĂ©e qui, dans une transaction, Ă©crit toutes les valeurs des tables temporaires dans la base de donnĂ©es.

Ajustement de groupe


TrĂšs souvent, l'utilisateur doit modifier la valeur de la colonne pour tous les objets sĂ©lectionnĂ©s dans la liste en mĂȘme temps. Pour ce faire, il y a un bouton spĂ©cial dans la barre d'outils de chaque liste (avec le raccourci clavier F12). Lorsque vous appuyez dessus, le mode d'Ă©dition de cellule normal est activĂ©, mais les modifications ne s'appliquent pas Ă  l'enregistrement en cours, mais Ă  tous les enregistrements sĂ©lectionnĂ©s.

Ce mécanisme vous permet d'éditer rapidement un grand nombre d'objets selon des critÚres spécifiés:
image


Comme lors de l'Ă©dition normale, les modifications ne sont pas immĂ©diatement enregistrĂ©es dans la base de donnĂ©es, mais sont enregistrĂ©es dans des tables temporaires. Ensuite, l'utilisateur devra cliquer sur le bouton Enregistrer pour les Ă©crire dans la base de donnĂ©es. L'inconvĂ©nient de cette approche peut ĂȘtre que l'utilisateur modifie accidentellement les donnĂ©es supplĂ©mentaires. Mais ici, comme on dit, le principe fonctionne: «avec une grande puissance vient une grande responsabilité».

Résumé de la liste


Dans n'importe quelle liste, l'utilisateur a la possibilité de connaßtre le nombre d'enregistrements ou le montant d'une certaine colonne dans la sélection actuelle. Pour ce faire, l'utilisateur doit cliquer sur les boutons appropriés dans la barre d'outils d'une liste spécifique:
image


Pour obtenir ces donnĂ©es, une requĂȘte sera automatiquement gĂ©nĂ©rĂ©e avec l'expression COUNT (*) ou SUM, dans WHERE dont l'expression de sĂ©lection actuelle sera ajoutĂ©e. GrĂące Ă  cette fonctionnalitĂ©, vous pouvez obtenir rapidement des totaux Ă  partir de listes sans recourir Ă  la gĂ©nĂ©ration de rapports.

Dans la version bureau du client, il est également possible de calculer la somme des cellules sélectionnées par analogie avec Excel:
image


Copier / coller


Dans la version de bureau, l'utilisateur a la possibilité de marquer certaines cellules, appuyez sur CTRL + C et collez-en les valeurs dans le presse-papiers:
image


De la mĂȘme maniĂšre, vous pouvez coller le tableau du presse-papiers dans n'importe quelle liste modifiable sur n'importe quel formulaire:
image

Une telle opportunité est souvent une alternative au développement d'importations spécialisées.

RĂ©glage de la table


Dans n'importe quelle liste, vous pouvez modifier certains de ses paramĂštres:
image

Vous pouvez modifier la composition des colonnes, leurs tailles, en-tĂȘtes, masques, etc. Vous pouvez enregistrer les paramĂštres du tableau Ă  la fois pour l'utilisateur actuel et pour tous les utilisateurs (si l'utilisateur actuel dispose des droits nĂ©cessaires).

Notez l'option Taille de la page. En l'utilisant, vous pouvez redimensionner la «fenĂȘtre» dĂ©crite au dĂ©but de l'article. Par exemple, au lieu de 50 entrĂ©es automatiques, vous pouvez spĂ©cifier une valeur plus Ă©levĂ©e. Ensuite, une plus grande quantitĂ© de donnĂ©es sera tĂ©lĂ©chargĂ©e sur le client et le serveur, mais les demandes se produiront moins frĂ©quemment. La dĂ©finition de la valeur de ce paramĂštre Ă  0 le rendra normal Ă  partir de n'importe quelle liste dynamique, c'est-Ă -dire que toutes les entrĂ©es de la liste seront toujours lues. La taille de la fenĂȘtre peut Ă©galement ĂȘtre spĂ©cifiĂ©e directement dans le code Ă  l'aide du paramĂštre pageSize de l'instruction DESIGN .

Exporter vers Excel


Pour toute liste, il est possible de télécharger tous ses enregistrements dans Excel. Pour ce faire, cliquez simplement sur le bouton suivant:
image

Cela prend en compte les sélections actuelles, les tris, ainsi que uniquement les colonnes visibles spécifiées dans les paramÚtres du tableau.

Pivotant


Par défaut, toute liste est affichée sous forme de tableau. Mais il y a la possibilité de le basculer vers un mode d'affichage spécial dans lequel l'utilisateur peut construire différents rapports et diagrammes:
image


Avec un petit nombre d'entrĂ©es dans la liste, les donnĂ©es seront traitĂ©es directement sur le client. DĂšs que la quantitĂ© de donnĂ©es dĂ©passe un certain seuil, les requĂȘtes de base de donnĂ©es gĂ©nĂ©rĂ©es automatiquement sur le serveur seront utilisĂ©es pour regrouper les donnĂ©es.

Alternative


Une question raisonnable se pose. Comment rĂ©soudre le problĂšme de l'Ă©dition de listes dynamiques sur des plateformes oĂč cette fonctionnalitĂ© n'est pas prise en charge. Le plus souvent, ils dressent une liste simple, forçant l'utilisateur Ă  limiter le nombre d'entrĂ©es par certaines sĂ©lections (par exemple, spĂ©cifiez des filtres par catĂ©gorie, fournisseur ou autres rĂ©pertoires associĂ©s).

Cependant, cette approche pose un sĂ©rieux problĂšme. MĂȘme avec des sĂ©lections Ă©tablies, rien ne garantit qu'un nombre important d'enregistrements ne seront pas dans l'Ă©chantillon. Il est impossible de calculer Ă  l'avance le nombre de valeurs obtenues, car souvent la complexitĂ© d'une telle opĂ©ration est directement comparable Ă  la complexitĂ© d'obtention de toutes les donnĂ©es. Par consĂ©quent, dans certains cas, un grand nombre d'entrĂ©es seront ajoutĂ©es Ă  la liste, ce qui entraĂźnera une grande consommation de ressources sur le serveur ou le client, ainsi qu'une baisse significative des performances.

Conclusion


La mise en Ɠuvre d'une liste dynamique dans le dĂ©veloppement moderne n'est pas la tĂąche la plus triviale, car les parties client et serveur sont impliquĂ©es. Il existe de nombreuses bibliothĂšques open source avec une licence ouverte dans le monde qui vous permettent d'implĂ©menter rapidement et facilement cette fonctionnalitĂ©.

Dans la plate-forme lsFusion ouverte et gratuite, des listes dynamiques sont créées dans plusieurs lignes de code et offrent à l'utilisateur un grand nombre de possibilités de travailler avec elles. En combinaison avec la possibilité de modifier de telles listes, la plate-forme vous permet de travailler rapidement avec des documents sur des centaines de milliers de lignes, d'organiser un travail pratique sur la sélection des enregistrements dans les documents, d'effectuer des modifications de groupe dans les répertoires, et bien plus encore.

L'utilisation de listes dynamiques peut réduire considérablement la consommation de temps processeur et de mémoire sur le serveur et le client en travaillant avec un ensemble limité de données, ainsi que réduire la charge sur le canal de communication entre le serveur et le client. En raison de cette efficacité élevée, cinq des huit plus grandes chaßnes de distribution exercent leurs principales activités opérationnelles sur des solutions basées sur la plate-forme lsFusion au Bélarus.

Source: https://habr.com/ru/post/fr484648/


All Articles