Page 1 sur 1

DBFunctions en Java Script V1

MessagePublié: 11 Août 2008 à 08:42
par Michael DELIQUE
Pour Faire des DBColum et des DBLookup en Ajax

[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 et uniquement la premiere colonne de la vue 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$/, '');
}

//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 11 : 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

//teste si la requete renvoi au moins 1 ligne
try {
var nbRow = parseInt(XHRequest.responseXML.getElementsByTagName("viewentries")[0].getAttribute("toplevelentries"), 10);
if (nbRow === undefined || nbRow === null || isNaN(nbRow) === true || nbRow === "" || nbRow === "0" || nbRow === 0) {
if (separateur === "ARRAY") {
return [];
}
else {
return "";
}
}

}
catch (e) {
alert("Ajax " + caller + " Error 12 : Flux XML ( Recovery ) Error\nView : ''" + viewName + "''\n URL : " + urlRequeste);
return null;
}

try {
var response = XHRequest.responseXML.documentElement;
}
catch (e) {
alert("Ajax " + caller + " Error 13 : XHRequest.responseXML.documentElement not found\nView : ''" + viewName + "''\n URL : " + urlRequeste);
return null;
}

var retourArray = [];
var retour = "";
var columns;
var valeur = "";
var nbIndex = 0;
try {
var entries = response.getElementsByTagName("viewentry");
//récupere le numéro de la derniere colonne
var nbLastColumn = entries[0].getElementsByTagName("text").length;
}
catch (e) {
if (separateur === "ARRAY") {
return [];
}
else {
return "";
}
}

if (nbColumnPosition > nbLastColumn) {
//controle que la colonne passé en parametre est valide
alert("Ajax " + caller + " Error 14 : bad number column (" + nbColumnPosition + " > " + nbLastColumn + ")\ncolumns in the View : " + nbLastColumn + "\ncolumn called : " + nbColumnPosition + "\nView : ''" + viewName + "''\nURL : " + urlRequeste);
return null;
}
if (nbKeyColumnPosition > nbLastColumn) {
//controle que la colonne passé en parametre est valide
alert("Ajax " + caller + " Error 15 : bad number column key (" + nbKeyColumnPosition + " > " + nbLastColumn + ")\ncolumns in the View : " + nbLastColumn + "\ncolumn key called : " + nbKeyColumnPosition + "\nView : ''" + viewName + "''\nURL : " + urlRequeste);
return null;
}
var i = 0;
var i2 = 0;
if (keyValeur === "") {
// si keyValeur est vide c'est un dbcolumn
for (i = 0, i2 = entries.length; i < i2; i++) {
columns = entries[i].getElementsByTagName("text");
try {
valeur = columns.item(nbColumnPosition).firstChild.nodeValue;
}
catch (e) {
valeur = "";
}

if (valeur === undefined || valeur === null) {
valeur = "";
}
if (separateur === "ARRAY") {
retourArray[nbIndex] = valeur;
nbIndex++;
}
else {
if (retour === "") {
retour = valeur;
}
else {
retour += separateur + valeur;
}
}
valeur = "";
}
}
else {
var keyValeurView = "";

for (i = 0, i2 = entries.length; i < i2; i++) {
columns = entries[i].getElementsByTagName("text");
try {
keyValeurView = columns.item(nbKeyColumnPosition).firstChild.nodeValue;
}
catch (e) {
keyValeurView = "";
}
if (keyValeurView === undefined || keyValeurView === null) {
keyValeurView = "";
}

if (keyValeurView === keyValeur) {
try {
valeur = columns.item(nbColumnPosition).firstChild.nodeValue;
}
catch (e) {
valeur = "";
}
if (valeur === undefined || valeur === null) {
valeur = "";
}
if (separateur === "ARRAY") {
retourArray[nbIndex] = valeur;
nbIndex++;
}
else {
if (retour === "") {
retour = valeur;
}
else {
retour += separateur + valeur;
}
}
valeur = "";
}
}
}
if (separateur === "ARRAY") {
return retourArray;
}
else {
return retour;
}
}
else {
alert("Ajax " + caller + " Error 16 : " + 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 is empty");
return null;
}
else {
view = stringFormat(view);
}
if (nbColumn === undefined || nbColumn === '' || 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 = stringFormat(server) + "/" + stringFormat(pathfile) + "/" + stringFormat(view) + "?ReadViewEntries&Count=-1&ExpandView&PreFormat&ResortAscending=" + nbColumn;
if (nbNoCache === true) {
url += "&" + Math.random();
}

return traitementXML(url, view, (nbColumn - 1), "", 0, 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("key is empty");
return null;
}
else {
key = stringFormat(key);
}
if (nbColumn === undefined || nbColumn === null || nbColumn === '' || isNaN(nbColumn)) {
alert("Ajax dbLookup Error 6 : 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 = nbColumn - 1;
}
if (nbNoCache === true) {
url += "&" + Math.random();
}

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

function dbLookup2(server, pathfile, view, key, nbKeyColumn, nbColumn, separator, nbNoCache, RestrictCategory){
//ce dblookup permet de faire unr echerche 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 7 : pathFile is empty");
return null;
}
if (view === undefined || view === null || view === "" || stringFormat(view) === "") {
alert("Ajax dbLookup2 Error 8 : view is empty");
return null;
}
else {
view = stringFormat(view);
}
if (key === undefined || key === null || key === "" || stringFormat(key) === "") {
alert("key is empty");
return null;
}
else {
key = stringFormat(key);
}
if (nbKeyColumn === undefined || nbKeyColumn === null || nbKeyColumn === '' || isNaN(nbKeyColumn)) {
alert("Ajax dbLookup2 Error 9 : nbKeyColumn not a number : " + nbKeyColumn);
return null;
}
if (nbColumn === undefined || nbColumn === null || nbColumn === '' || isNaN(nbColumn)) {
alert("Ajax dbLookup2 Error 10 : 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 === null || nbNoCache === undefined || nbNoCache === "" || isNaN(nbNoCache) || nbNoCache !== true) {
nbNoCache = false;
}

if (RestrictCategory === undefined || RestrictCategory === null || RestrictCategory === "" || stringFormat(RestrictCategory) === "") {
RestrictCategory = "";
}

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

return traitementXML(url, view, (nbColumn - 1), key, (nbKeyColumn - 1), separator, "DBLookup2");
}

[/syntax]

MessagePublié: 21 Oct 2008 à 09:49
par Michael DELIQUE
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)

MessagePublié: 25 Oct 2008 à 13:28
par Michael DELIQUE
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