DBFunctions en Java Script V2 (BETA 4)

Toutes les astuces sur le langage JavaScript dans Lotus Notes

DBFunctions en Java Script V2 (BETA 4)

Messagepar Michael DELIQUE » 21 Oct 2008 à 14:49

CETTE FONCTION N'A PAS ENCORE PASSER LE TESTE DE LA MISE EN PRODUCTION, C'EST UNE VERSION BETA 3 QUI A PASSEE LES TESTS UNITAIRE

[syntax="javascript"]/*
attention :
- dans les vues, les colonnes sont numérotées à partie de 1 et dans le flux XML à partir de zéro
- les colonnes masqué ne sont pas prisent en compte par le readviewentries
- le readviewentries ne peux pas renvoyer plus de ligne que le nombre maximal autorisé par le server
la fonction convertie les numéro de colonne des vues en numéro de colonne pour le flux xml
la variable separator contient le Separateur de liste, pour renvoyer un tableau passer "ARRAY", ou "" comme separateur.
nbNoCache = true permet de générer une url unique, donc pas de cache. défaut ça charge le cache du navigateur
RestrictCategory ne fonctionne que si la premiere colonne est catégorisé.
pour la fonction dblookup, RestrictCategory est égale a true ou false, true activant le RestrictCategory sur la clé de recherche
pour la fonction dblookup2, RestrictCategory contient la chaine pour effectuer l'opération, si la valeur est vide ou null le RestrictCategory n'est pas effectué
*/
// format la chaine en retirant les caracteres indésirable
function stringFormat(source){
if (source.length === 0) {
return "";
}
return source.replace(/^\s/, '').replace(/\s$/, '');
}

function columnCheck(nbColumnPosition, nbKeyColumnPosition, nbColumnCheck, caller, viewName, urlRequeste){

if (nbColumnPosition === undefined || nbColumnPosition === null) {
alert("Ajax " + caller + "/columnChec Error 15 : nbColumnPosition not valid (" + nbColumnPosition + ")\nView : ''" + viewName + "''\n URL : " + urlRequeste);
return false;
}
if (nbKeyColumnPosition === undefined || nbKeyColumnPosition === null) {
alert("Ajax " + caller + "/columnChec Error 16 : nbKeyColumnPosition not valid (" + nbKeyColumnPosition + ")\nView : ''" + viewName + "''\n URL : " + urlRequeste);
return false;
}
if (nbColumnCheck === undefined || nbColumnCheck === null) {
alert("Ajax " + caller + "/columnChec Error 17 : nbColumnCheck not valid (" + nbColumnCheck + ")\nView : ''" + viewName + "''\n URL : " + urlRequeste);
return false;
}

if (nbColumnPosition > nbColumnCheck) {
//controle que la colonne passé en parametre est valide
alert("Ajax " + caller + " Error 18 : bad number column (" + nbColumnPosition + " > " + nbColumnCheck + ")\ncolumns in the View : " + nbColumnCheck + "\ncolumn called : " + nbColumnPosition + "\nView : ''" + viewName + "''\nURL : " + urlRequeste);
return false;
}

if (nbKeyColumnPosition > nbColumnCheck) {
//controle que la colonne passé en parametre est valide
alert("Ajax " + caller + " Error 19 : bad number column key (" + nbKeyColumnPosition + " > " + nbColumnCheck + ")\ncolumns in the View : " + nbColumnCheck + "\ncolumn key called : " + nbKeyColumnPosition + "\nView : ''" + viewName + "''\nURL : " + urlRequeste);
return false;
}

return true;
}

function formatRetour(retour, arrayRetour, valeurSave, keyValeurSave, keyValeur, separateur){

var nbIndexRetour = 0;

if (arrayRetour === undefined || arrayRetour === null) {
arrayRetour = [];
}
else {
nbIndexRetour = parseInt(arrayRetour.length, 10);
}

if (keyValeur === "") {
if (separateur === "ARRAY") {
arrayRetour[nbIndexRetour] = valeurSave;
}
else {
if (retour === "") {
retour = valeurSave;
}
else {
retour += separateur + valeurSave;
}
}
}
else {

if (keyValeur === keyValeurSave) {
if (separateur === "ARRAY") {
arrayRetour[nbIndexRetour] = valeurSave;
}
else {
if (retour === "") {
retour = valeurSave;
}
else {
retour += separateur + valeurSave;
}
}
}

}

if (separateur === "ARRAY") {
return arrayRetour;
}
else {
return retour;
}
}

//cette function teste si le flux XML est complétement chargé et en extrait les données de la colonne
function traitementXML(urlRequeste, viewName, nbColumnPosition, keyValeur, nbKeyColumnPosition, separateur, caller){

var XHRequest = null;

if (window.XMLHttpRequest) {
// Firefox et autres
XHRequest = new XMLHttpRequest();
if (XHRequest.overrideMimeType) {
XHRequest.overrideMimeType('text/xml');
}
}
else
if (window.ActiveXObject) {
// Internet Explorer
try {
XHRequest = new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e) {
XHRequest = new ActiveXObject("Microsoft.XMLHTTP");
}
}
else {
//non supporté par le navigateur
alert("Ajax " + caller + " Error 12 : XMLHttpRequest non supporté par le navigateur\nView : ''" + viewName + "''\n URL : " + urlRequeste);
return null;
}

XHRequest.open("GET", urlRequeste, false);
//XHRequest.async=false;
XHRequest.send(null);

//traitement uniquement si le flux XML est complètement chargé; 4 = complet"
if (XHRequest.status === 200) {
//Taitement si tou t est OK
var nbRow = 0;
//teste si la requete renvoi au moins 1 ligne
try {
nbRow = parseInt(XHRequest.responseXML.getElementsByTagName("viewentries")[0].getAttribute("toplevelentries"), 10);
if (nbRow === "" || isNaN(nbRow) === false || nbRow === "0" || nbRow === 0) {
if (separateur === "ARRAY") {
return [];
}
else {
return "";
}
}
}
catch (e) {
alert("Ajax " + caller + " Error 13 : Flux XML ( Recovery ) Error\nView : ''" + viewName + "''\n URL : " + urlRequeste);
return null;
}

//on recupère et teste qu'il ya bien un document XML
try {
var response = XHRequest.responseXML.documentElement;
}
catch (e) {
alert("Ajax " + caller + " Error 14 : XHRequest.responseXML.documentElement not found\nView : ''" + viewName + "''\n URL : " + urlRequeste);
return null;
}

//teste qu'il ya au moins une ligne de renvoyé
try {
nbRow = parseInt(XHRequest.responseXML.getElementsByTagName("viewentries")[0].getAttribute("toplevelentries"), 10);
if (nbRow === "" || isNaN(nbRow) === false || nbRow === "0" || nbRow === 0) {
return [];
}
}
catch (e) {
return [];
}

if (nbColumnPosition === undefined || nbColumnPosition === null || nbColumnPosition === '') {
nbColumnPosition = 0;
}
if (nbKeyColumnPosition === undefined || nbKeyColumnPosition === null || nbKeyColumnPosition === '') {
nbKeyColumnPosition = -1;
}

var arraySave = [];
var arrayRetour = null;
var retour = "";

var nbIndex = 0;
var nbIndex_old = 0;
var nbIndexColonne = 0;
var nbIndexColonne_old = 0;
var valeur = '';
arraySave[nbIndex] = [];
var a = 0;
var a2 = 0;
var b = 0;
var b2 = 0;
var c = 0;
var c2 = 0;
var i = 0;

try {
var entries = XHRequest.responseXML.documentElement.getElementsByTagName("viewentry");
}
catch (e) {
return [];
}

for (a = 0, a2 = entries.length; a < a2; a++) {

var XMLEntry = entries[a];

for (b = 0, b2 = XMLEntry.childNodes.length; b < b2; b++) {

var entryData = XMLEntry.getElementsByTagName('entrydata')[b];
if (entryData !== null) {
valeur = '';
if (entryData.hasChildNodes() === true) {
nbIndexColonne = Number(entryData.getAttributeNode('columnnumber').value) + 1;
for (c = 0, c2 = entryData.childNodes.length; c < c2; c++) {
try {
valeur = entryData.childNodes[c].lastChild.nodeValue;
}
catch (e) {
valeur = '';
}

if (nbIndexColonne < nbIndexColonne_old) {
if (nbIndexColonne > 1) {
if (arraySave[0] !== null && arraySave.length === 1) {
//teste que le numero de colonne passé en parametre est correct
if (columnCheck(nbColumnPosition, nbKeyColumnPosition, (arraySave[0].length - 1), caller, viewName, urlRequeste) === false) {
arraySave = [];
arrayRetour = [];
retour = "";
return null;
}
}
nbIndex_old = nbIndex;
nbIndex++;
arraySave[nbIndex] = [];
for (i = 1; i < nbIndexColonne; i++) {
arraySave[nbIndex][i] = arraySave[nbIndex_old][i];
}
nbIndex_old = 0;

}
else {
nbIndex++;
arraySave[nbIndex] = [];
}

arrayRetour = formatRetour(retour, arrayRetour, arraySave[nbIndex - 1][nbColumnPosition], arraySave[nbIndex - 1][nbKeyColumnPosition], keyValeur, separateur);
//vidage des élément de tableau don on a pas besoin afin de l'alléger
nbIndex_old = nbIndex - 2;
if (nbIndex_old >= 0) {
arraySave[nbIndex_old] = null;
}
nbIndex_old = 0;
}
if (nbColumnPosition === nbIndexColonne || nbKeyColumnPosition === nbIndexColonne) {
arraySave[nbIndex][nbIndexColonne] = valeur;
}
else {
arraySave[nbIndex][nbIndexColonne] = "";
}
nbIndexColonne_old = nbIndexColonne;
}
}
}
}
}

arrayRetour = formatRetour(retour, arrayRetour, arraySave[nbIndex][nbColumnPosition], arraySave[nbIndex][nbKeyColumnPosition], keyValeur, separateur);

if (columnCheck(nbColumnPosition, nbKeyColumnPosition, (arraySave[nbIndex].length - 1), caller, viewName, urlRequeste) === false) {
arraySave = [];
arrayRetour = [];
retour = "";
return null;
}
arraySave = [];
if (separateur === "ARRAY") {
return arrayRetour;
}
else {
return retour;
}
}
else {
alert("Ajax " + caller + " Error 20 : " + XHRequest.statusText + "\n " + XHRequest.status + "\nView : ''" + viewName + "''\n URL : " + urlRequeste);
return null;
}
}

function dbColumn(server, pathfile, view, nbColumn, separator, nbNoCache){

if (server === undefined || server === null || server === "" || stringFormat(server) === "") {
server = "";
}
else {
server = "http://" + stringFormat(server);
}
if (pathfile === undefined || pathfile === null || pathfile === "" || stringFormat(pathfile) === "") {
//si la valeur est vide récupere le chemin de la base en cours
pathfile = (document.location.href).toLowerCase();
pathfile = pathfile.substring(pathfile.indexOf('/', pathfile.indexOf('://') + 3) + 1, pathfile.lastIndexOf('nsf') + 3);
}
pathfile = stringFormat(pathfile);
if (pathfile === "") {
alert("Ajax dbColumn Error 1 : pathFile is empty");
return null;
}
if (view === undefined || view === null || view === "" || stringFormat(view) === "") {
alert("Ajax dbColumn Error 2 : view is empty");
return null;
}
else {
view = stringFormat(view);
}
if (isNaN(nbColumn)) {
alert("Ajax dbColumn Error 3 : nbColumn not a number : " + nbColumn);
return null;
}
if (separator === undefined || separator === null || separator === "" || stringFormat(separator) === "" || separator.toUpperCase() === "ARRAY") {
separator = "ARRAY";
}
else {
separator = stringFormat(separator.toUpperCase());
}
if (nbNoCache === undefined || nbNoCache === null || nbNoCache === "" || isNaN(nbNoCache) || nbNoCache !== true) {
nbNoCache = false;
}

var url = server + "/" + pathfile + "/" + view + "?ReadViewEntries&Count=-1&ExpandView&PreFormat&ResortAscending=" + nbColumn;
if (nbNoCache === true) {
url += "&" + Math.random();
}

return traitementXML(url, view, nbColumn, "", 1, separator, "DBColumn");

}

function dbLookup(server, pathfile, view, key, nbColumn, separator, nbNoCache, nbRestrictCategory){

if (server === undefined || server === null || server === "" || stringFormat(server) === "") {
server = "";
}
else {
server = "http://" + stringFormat(server);
}
if (pathfile === undefined || pathfile === null || pathfile === "" || stringFormat(pathfile) === "") {
//si la valeur est vide récupere le chemin de la base en cours
pathfile = (document.location.href).toLowerCase();
pathfile = pathfile.substring(pathfile.indexOf('/', pathfile.indexOf('://') + 3) + 1, pathfile.lastIndexOf('nsf') + 3);
}
pathfile = stringFormat(pathfile);
if (pathfile === "") {
alert("Ajax dbLookup Error 4 : pathFile is empty");
return null;
}
if (view === undefined || view === null || view === "" || stringFormat(view) === "") {
alert("Ajax dbLookup Error 5 : view is empty");
return null;
}
else {
view = stringFormat(view);
}
if (key === undefined || key === null || key === "" || stringFormat(key) === "") {
alert("Ajax dbLookup Error 6 : key is empty");
return null;
}
else {
key = stringFormat(key);
}
if (nbColumn === undefined || nbColumn === null || isNaN(nbColumn)) {
alert("Ajax dbLookup Error 7 : nbColumn not a number : " + nbColumn);
return null;
}
if (separator === undefined || separator === null || separator === "" || stringFormat(separator) === "" || separator.toUpperCase() === "ARRAY") {
separator = "ARRAY";
}
else {
separator = stringFormat(separator.toUpperCase());
}
if (nbNoCache === undefined || nbNoCache === null || nbNoCache === "" || isNaN(nbNoCache) || nbNoCache !== true) {
nbNoCache = false;
}
if (nbRestrictCategory === undefined || nbRestrictCategory === null || nbRestrictCategory === "" || isNaN(nbRestrictCategory) || nbRestrictCategory !== true) {
nbRestrictCategory = false;
}

var url = server + "/" + pathfile + "/" + view + "?ReadViewEntries&Count=-1&ExpandView&PreFormat&ResortAscending=0"; //&StarKey=" + key + "&UntilKey=" + key + "_";
if (nbRestrictCategory === true) {
url += "&RestrictToCategory=" + key;
key = "";
nbColumn--;
}
if (nbNoCache === true) {
url += "&" + Math.random();
}

return traitementXML(url, view, nbColumn, key, 1, separator, "DBLookup");
}

function dbLookup2(server, pathfile, view, key, nbKeyColumn, nbColumn, separator, nbNoCache, RestrictCategory){
//ce dblookup permet de faire une recherche sur une vue non trié et choisissant la colonne de recherche

if (server === undefined || server === null || server === "" || stringFormat(server) === "") {
server = "";
}
else {
server = "http://" + stringFormat(server);
}
if (pathfile === undefined || pathfile === null || pathfile === "" || stringFormat(pathfile) === "") {
//si la valeur est vide récupere le chemin de la base en cours
pathfile = (document.location.href).toLowerCase();
pathfile = pathfile.substring(pathfile.indexOf('/', pathfile.indexOf('://') + 3) + 1, pathfile.lastIndexOf('nsf') + 3);
}
pathfile = stringFormat(pathfile);
if (pathfile === "") {
alert("Ajax dbLookup2 Error 8 : pathFile is empty");
return "";
}
if (view === undefined || view === null || view === "" || stringFormat(view) === "") {
alert("Ajax dbLookup2 Error 9 : view is empty");
return null;
}
else {
view = stringFormat(view);
}
if (key === undefined || key === null || key === "" || stringFormat(key) === "") {
alert("Ajax dbLookup2 Error 10 : key is empty");
return null;
}
else {
key = stringFormat(key);
}
if (nbKeyColumn === undefined || nbKeyColumn === null || isNaN(nbKeyColumn)) {
alert("Ajax dbLookup2 Error 11 : nbKeyColumn not a number : " + nbKeyColumn);
return null;
}
if (nbColumn === undefined || nbColumn === null || isNaN(nbColumn)) {
alert("Ajax dbLookup2 Error 11 : nbColumn not a number : " + nbColumn);
return null;
}
if (separator === undefined || separator === null || separator === "" || stringFormat(separator) === "" || separator.toUpperCase() === "ARRAY") {
separator = "ARRAY";
}
else {
separator = stringFormat(separator.toUpperCase());
}
if (nbNoCache === undefined || nbNoCache === null || nbNoCache === "" || isNaN(nbNoCache) || nbNoCache !== true) {
nbNoCache = false;
}
if (RestrictCategory === undefined || RestrictCategory === null || RestrictCategory === "" || stringFormat(RestrictCategory) === "") {
RestrictCategory = "";
}

var url = stringFormat(server) + "/" + stringFormat(pathfile) + "/" + stringFormat(view) + "?ReadViewEntries&Count=-1&ExpandView&PreFormat&ResortAscending=" + (nbKeyColumn - 1); // + "&StarKey=" + key + "&UntilKey=" + key + "_";
if (RestrictCategory !== "") {
url += "&RestrictToCategory=" + stringFormat(RestrictCategory);
nbColumn--;
nbKeyColumn--;
if (nbKeyColumn === 0) {
key = "";
}
}
if (nbNoCache === true) {
url += "&" + Math.random();
}
return traitementXML(url, view, nbColumn, key, nbKeyColumn, separator, "DBLookup2");
}
[/syntax]
Dernière édition par Michael DELIQUE le 08 Juil 2011 à 10:41, édité 23 fois.
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy

Messagepar Jérome Deniau » 24 Oct 2008 à 11:20

Dans ton code

XHRequest.open("GET", urlRequeste , false);
XHRequest.async=False;
XHRequest.send(null);


L'intérêt, c'est que AJAX attend la réponse, donc dans le cas d'un refresh de la page sur un dbcolumn ou dblookup, tu es sûr qu'il recharge complètement les data au lieu de fournir le cache si les temps de réponse sont trop longs ou supposés trop longs pour lui...

XHRequest.async=False => synchrone
XHRequest.async=true => Asynchrine

[EDIT] XHRequest.async=False n'est pas stable sur tous les navigateurs
Jérome Deniau
 

Messagepar Michael DELIQUE » 25 Oct 2008 à 13:27

Concernant la gestion du cache, un excellent article de Julien qui explique bien les choses (ne pas oublier de lire les commentaires)

=> http://www.domlike.net/domlike/dl2.nsf/d6plinks/DOME-6PGSJN
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy

Messagepar Michael DELIQUE » 19 Nov 2008 à 21:24

quelques Explications sur les Paramètres

Server : Non obligatoire car par défaut ça prend le serveur web en cours (sauf si tu tape sur un autre serveur web)

pathfile : Non obligatoire car par défaut prend le path et le file de la base en cours, sinon attend une valeur du genre : @webdbname

view : nom ou pseudo de la vue

key : clé de recherche identique au @dblookup en formule

nbColumn : N° de la colonne a traité comme pour le @dbcolumn/@dblookup en formule

separator : (facultatif) si rien (ou 'array') renvois un array, sinon un chaîne avec chaque élément séparé par le séparateur donnée

nbNoCache : (facultatif) false si rien, à true génère une url unique pour éviter les problèmes de cache (cette option pourri le cache du navigateur)
Cordialement

Michael (SMS-Phobique)
----------------------------
"La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi."
Albert EINSTEIN
Avatar de l’utilisateur
Michael DELIQUE
Administrateur
Administrateur
 
Message(s) : 12183
Inscrit(e) le : 16 Déc 2004 à 10:36
Localisation : Paris/Cergy


Retour vers JavaScript