IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ASP Discussion :

Existe-t-il un FrameWork ASP3?


Sujet :

ASP

  1. #1
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut Existe-t-il un FrameWork ASP3?
    Salut,

    Existe-t-il un FrameWork ASP3?

    Et bien oui. Qu'est-ce qu'un FW? Et bien la definition de Wikipédia est assez bonne.

    Sans plus attendre il est en pièce jointe.

    C'est moi qui l'ai fait. Je dois dire que depuis quelques mois, j'utilise beaucoup de classes ASP pour coder. Cela rend beaucoup de service si ce n'est pas trop le bazar. Pourtant, il me manquait ce petit qqch qui pouvait transformer tous ces outils en un framework convenable.

    Il est très loin d'être terminé. Il souffre certainement de beaucoup d'imperfections, mais si vous voulez bien m'aider, je crois que nous allons pouvoir l'améliorer et le rendre vraiment utile. Il faudrait y ajouter une classe pour manipuler les dates, lire un web.config, ...

    Utile à quoi? Et bien dans un premier temps je dirai qu'il va beaucoup nous aider à interroger proprement notre base de données préférée. Ensuite, il va bien nous aider à débuguer. Et puis j'ose espérer à rendre notre code plus lisible.

    Le ZIP contient un certain nombre de fichiers. Il s'agit des classes du FW. Vous pouvez le récupérer et les copier dans un dossier de votre site Web.
    Ci-dessous 3 exemples pour illustrer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <%@ language="VBSCRIPT" codepage="1252" %>
     
    <!--#include file="fw/cls_Immobilis.asp" -->
     
    <%
    ' Déclaration d'un variable globale à laquelle sera liée le framework
    Dim Immo
     
    ' Appel de la procédure principale
    Call Main
     
    ' Procédure principale pilotant la page
    Public Sub Main
        Set Immo = New Immobilis
     
            ' Affichage du context Http
            Immo.Http.ToTable
     
        Set Immo = Nothing
    End Sub
    %>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <%@ language="VBSCRIPT" codepage="1252" %>
     
    <!--#include file="fw/cls_Immobilis.asp" -->
     
    <%
    ' Déclaration d'un variable globale à laquelle sera liée le framework
    Dim Immo
     
    ' Appel de la procédure principale
    Call Main
     
    ' Procédure principale pilotant la page
    Public Sub Main
        Set Immo = New Immobilis
            ' Assignement de la propriété du fournisseur de données au gestionnaire de base de données.
            ' Ici, il s'agit de SQL. Ce pourrait être Access.
            ' Immo.BD.Provider = "Driver={Microsoft Access Driver (*.mdb)}; DBQ = " & Server.MapPath("BaseDeDonnees.mdb") & ";"
            ' Ce pourrait être aussi une variable d'application initialisée dans le "Global.asa"
            ' Immo.BD.Provider = Application("ConnectionString")
     
            Immo.BD.Provider = "Driver={SQL Native Client};Server=127.0.0.1;Database=MaBase;Uid=sa;Pwd=sa;"
            Call Immo.BD.SqlToTable("SELECT * FROM [USER]", "")
     
        Set Immo = Nothing
    End Sub
    %>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    <%@ language="VBSCRIPT" codepage="1252" %>
     
    <!--#include file="fw/cls_Immobilis.asp" -->
     
    <%
    ' Indication que l'on souhaite voir s'afficher toutes les indications de débugage dispersées dans le code
    Debug.IsDebug = true
    ' Indication que l'on souhaite voir s'afficher tous les recordsets signalés explicitement
    Debug.IsDebugTbl = true
     
    ' Déclaration d'un variable globale à laquelle sera liée le framework
    Dim Immo
     
    ' Appel de la procédure principale
    Call Main
     
    ' Procédure principale pilotant la page
    Public Sub Main
        Dim StrSql
     
        Set Immo = New Immobilis
            ' Assignement de la propriété du fournisseur de données au gestionnaire de base de données.
            ' Ici, il s'agit de SQL. Ce pourrait être Access.
            ' Immo.BD.Provider = "Driver={Microsoft Access Driver (*.mdb)}; DBQ = " & Session("BaseDeDonnees") & ";"
            ' Ce pourrait être aussi une variable d'application initialisée dans le "Global.asa"
            ' Immo.BD.Provider = Application("ConnectionString")
            Immo.BD.Provider = "Driver={SQL Native Client};Server=127.0.0.1;Database=MaBase;Uid=sa;Pwd=sa;"
     
            %>
            <form action="" id="frm" method="post" enctype="application/x-www-form-urlencoded">
                <input id="txt" name="txt" type="text" value="<%=Immo.Http.ItemByKey("txt") %>" />
                <%
                ' La valeur des champs envoyé par le formulaire est stocké dans Immo.Http
     
                ' Creation d'une liste déroulante de pays
                StrSql = "select country_id, country_desc from country order by country_desc asc"
                call Immo.BD.SqlToDDListe(StrSql, "", Immo.Http.ItemByKey("country"), "country")
     
                ' Creation d'une liste déroulante d'équipes fonctionnelles
                StrSql = "select team_id, team_desc from team order by team_desc asc"
                call Immo.BD.SqlToDDListe(StrSql, "", Immo.Http.ItemByKey("team"), "team")
                %>
                <input type="submit" name="action" id="action" value="Go" />
            </form>
            <%
            ' Affichage du resultat uniquement si le formulaire est soumis quelque soit la méthode
            if Immo.Http.IsPostBack then
                strsql = "select * from [user] where (User_UserName like '%" & Immo.Http.ItemByKey("txt") & "%' and user_country = " & Immo.Http.ItemByKey("country") & " and user_team = " & Immo.Http.ItemByKey("team") & ")"
                Call Immo.BD.SqlToTable(strsql, "")
            End If
        Set Immo = Nothing
    End Sub
    %>
    Liste des fonctionnalités:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    "Class HttpContext";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    ;"Public Property Get Count"
    ;"Public Property Get Form"
    ;"Public Property Get QueryString"
    ;"Public Property Get IsPostBack"
    ;"Public Property Get ItemByKey(key)"
    ;"Public Property Get ItemByIndex(i)"
    ;"Public Property Get KeyByIndex(i)"
    ;"Public Sub ToTable"
    ;"Public Sub ToXml(path)"
    ;"Private Sub GrabServerVariables"
    ;"Private Sub GrabApplication"
    ;"Private Sub GrabSession"
    ;"Private Sub GrabCookies"
    ;"Private Sub GrabForm"
    ;"Private Sub GrabQueryString"
    ;"Private Sub SetArrays"
    "Class DBFactory";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    ;"Public Property Let Provider(value)"
    ;"Private Property Get Provider"
    ;"Private Property Set Connection(value)"
    ;"Private Property Get Connection"
    ;"Private Property Set Command(value)"
    ;"Private Property Get Command"
    ;"Private Property Let CountRequest(value)"
    ;"Private Property Get CountRequest"
    ;"Public Function ExecuteQuery(s)"
    ;"Public Function GetRst(s)"
    ;"Public Function GetRows(s)"
    ;"Public Sub RsToTable(rs, classname)"
    ;"Public Sub SqlToTable(sql, classname)"
    ;"Public Sub RsToDDListe(rs, classname, selectedvalue, id)"
    ;"Public Sub SqlToDDListe(sql, classname, selectedvalue, id)"
    ;"Public Sub RsToXls(rs, path)"
    "Class CFile";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    ;"Public Property Set File(value)"
    ;"Public Property Get File"
    ;"Public Sub DownLoad(path)"
    "Class CNumbers";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    ;"Public Function IsDecimal(byval str)"
    "Class CStrings";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    ;"Public Function ToProperCase(s)"
    ;"Public Function IsAlpha(c)"
    ;"Public Sub DisplayAscii"
    ;"Public Function ActivateHttp(str)"
    "Class CSecurity";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    ;"Public Property Get Encryption"
    ;"Public Property Get Authentication"
    "Class CCollection";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    "Class CDebug";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    ;"Public Property Let IsDebug(value)"
    ;"Public Property Get IsDebug"
    ;"Public Property Let IsDebugTbl(value)"
    ;"Public Property Get IsDebugTbl"
    ;"Public Property Let Color(value)"
    ;"Public Property Get Color"
    ;"Public Property Let THColor(value)"
    ;"Public Property Get THColor"
    ;"Public Property Let TDColor(value)"
    ;"Public Property Get TDColor"
    ;"Public Function DWrite(value)"
    ;"Public Sub RsToTable(rs)"
    La classe de base s'appelle "Immobilis" vous ne devez inclure que celle-ci dans vos pages ASP. Elle contient les liens vers les autres classe.
    Vous pouvez évidement la personnaliser en modifiant le nom: "System" eût été plus approprié.

    Il serait aussi interessant de construire les page en faisant des classes comme indiqué ici

    Voilà, j'espère avoir bientôt de vos nouvelles.

    Cordialement,

    Immobilis
    "Winter is coming" (ma nouvelle page d'accueil)

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 202
    Points : 215
    Points
    215
    Par défaut
    bonjour immobilis,

    voilà un travail impressionnant !
    moi qui utilise les classes depuis 2001, je ne m'en lasse pas
    même si j'ai plutôt des classes sur les objets que je manipule (personnes, etc ...). pour le reste (construction des menus déroulants, etc ...), j'ai une solide bibliothèque de fonctions (réparties en différents fichiers : dates, texte, BDD, formulaire, ...)

    Nico.
    Nico, l'agrotic géomatic

  3. #3
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Cool,

    Tu cela t'interesses, je te propose d'inclure les fonctionnalités que tu utilises et qui ne figurent pas dans ce framework et de publier la nouvelle version.

    Qu'en penses-tu?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 202
    Points : 215
    Points
    215
    Par défaut
    pourquoi pas !
    comment veux-tu que l'on procède ? je te prépare les fichiers asp de fonction et tu les intègres ? ou bien je fais un pré-tri dans les fonctions à partir de ton FW (j'espère dans ce cas ne pas avoir trop de merde dans les yeux et bien identifier ce qui est présent/absent...)

    Nico.
    Nico, l'agrotic géomatic

  5. #5
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Cool,

    Autant que tu essayes de les intégrer car ainsi, on pourra s'approprier les fonctionnalités et ainsi bien les connaître. Ou alors on se partage le travail. Tu en as beaucoup?

    Sinon, j'ai déjà fait la liste des classes, des propriétés, des fonctions et procédures dans mon premier post.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 202
    Points : 215
    Points
    215
    Par défaut
    je vais déjà te les lister.
    tu me diras si ça te parait opportun
    par contre, je ne sais pas si j'aurai le temps demain ...
    Nico, l'agrotic géomatic

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 202
    Points : 215
    Points
    215
    Par défaut liste des ajouts et fusions possibles
    salut Immobilis,

    voici les ajouts que je te propose, fusionnés avec l'existant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
     
    "Class HttpContext";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    ;"Public Property Get Count"
    ;"Public Property Get Form"
    ;"Public Property Get QueryString"
    ;"Public Property Get IsPostBack"
    ;"Public Property Get ItemByKey(key)"
    ;"Public Property Get ItemByIndex(i)"
    ;"Public Property Get KeyByIndex(i)"
    ;"Public Sub ToTable"
    ;"Public Sub ToXml(path)"
    ;"Private Sub GrabServerVariables"
    ;"Private Sub GrabApplication"
    ;"Private Sub GrabSession"
    ;"Private Sub GrabCookies"
    ;"Private Sub GrabForm"
    ;"Private Sub GrabQueryString"
    ;"Private Sub SetArrays"
     
    "Class DBFactory";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    ;"Public Property Let Provider(value)"
    ;"Private Property Get Provider"
    ;"Private Property Set Connection(value)"
    ;"Private Property Get Connection"
    ;"Private Property Set Command(value)"
    ;"Private Property Get Command"
    ;"Private Property Let CountRequest(value)"
    ;"Private Property Get CountRequest"
    ;"Public Function ExecuteQuery(s)"
    ;"Public Function GetRst(s)"
    ;"Public Function GetRows(s)"
    ;"Public Sub RsToTable(rs, classname)"
    ;"Public Sub SqlToTable(sql, classname)"
    ;"Public Sub RsToDDListe(rs, classname, selectedvalue, id)"
    ;"Public Sub SqlToDDListe(sql, classname, selectedvalue, id)"
    ;"Public Sub RsToXls(rs, path)"
     
    "Class CFile";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    ;"Public Property Set File(value)"
    ;"Public Property Get File"
    ;"Public Sub DownLoad(path)"
    '| Public function getFileExtension(pFileName)
    '| Public function getSizeAndUnit(pSize, pWithUnit)
     
    "Class CNumbers";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    ;"Public Function IsDecimal(byval str)"
    '| Public function toZero(pNum)
    '| Public function to00(pNum)
    '| Public function to000(pNum)
    '| Public function toDouble(pY)
    '| Public function notNegative(pValue)
    '| Public function format_double(pNbr)
    '| Public function format_integer(pNbr)
    '| Public function format_bigNumber(pNum)
    '| Public function max(pA1, pA2)
    '| Public function min(pA1, pA2)
     
    '| Class CDates
    '| Private Sub Class_Initialize
    '| Private Sub Class_Terminate
    '| Public function DecodeMilliSecondTimer(pMilliSecond)
    '| Public function get_today_ddmmyyyy 
    '| Public function format_date_ddmmyyyy(pDate)
    '| Public function stringDate_to_DDMMYYYY(pDate)
    '| Public function format_date(pDate)	'au format "01 janvier 2005"
    '| Public function format_time_hhmm(pDate)
     
    "Class CStrings";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    ;"Public Function ToProperCase(s)"
    ;"Public Function IsAlpha(c)"
    ;"Public Sub DisplayAscii"
    ;"Public Function ActivateHttp(str)"
    '| Public function default_value(pChaine, pValue)
    '| Public function db_in(pString)
    '| Public function db_out(pString)
    '| Public function db_txt_in(pString)
    '| Public function db_txt_out(pString)
    '| Public function js_encode(pString)
    '| Public function plural(pChaine, pNb)
    '| Public function Generate_random_text(nbCar)
    '| Public function noHTMLtag(pTxt)
    '| Public function onlyLettersAndNumbers(pTxt)
    '| Public function premiersMots(pTxt, pNum)
    '| Public function Generate_login(pPrenom, pNom)
    '| Public function Generate_Password(nbCar)
     
    "Class CSecurity";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    ;"Public Property Get Encryption"
    ;"Public Property Get Authentication"
     
    "Class CCollection";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    '| Public function collection_contains(pCollection, pItem)
     
    '| Class CForms
    '| Private Sub Class_Initialize
    '| Private Sub Class_Terminate
    '| Public Default Property Get DefaultProperty
    '| Public function size_input(pValue)
    '| Public sub combo (pRS, pName, pSelect, pTexte)
    '| Public sub combo_submit (pRS, pName, pSelect, pTexte, pForm)
    '| Public sub input_texte (pName, pSize, pTexte)
    '| Public sub input_textarea (pName, pCol, pRows, pTexte)
    '| Public sub date_field(name, pSize, value)
     
    "Class CDebug";
    ;"Private Sub Class_Initialize"
    ;"Private Sub Class_Terminate"
    ;"Public Default Property Get DefaultProperty"
    ;"Public Property Let IsDebug(value)"
    ;"Public Property Get IsDebug"
    ;"Public Property Let IsDebugTbl(value)"
    ;"Public Property Get IsDebugTbl"
    ;"Public Property Let Color(value)"
    ;"Public Property Get Color"
    ;"Public Property Let THColor(value)"
    ;"Public Property Get THColor"
    ;"Public Property Let TDColor(value)"
    ;"Public Property Get TDColor"
    ;"Public Function DWrite(value)"
    ;"Public Sub RsToTable(rs)"
     
    '| Class CEmail
    '| Private Sub Class_Initialize
    '| Private Sub Class_Terminate
    '| Public Default Property Get DefaultProperty
    '| Public Property Let SMTP_IP(pIP)
    '| Public sub sendMail(sFrom, sTo, sSubject, sTexte)
    '| Public sub sendMail2000(sFrom, sTo, sSubject, sTexte)
    '| Public sub sendMailCC(sFrom, sTo, sCC, sSubject, sTexte)
    '| Public sub sendMail_HTML(sFrom, sTo, sSubject, sTexte)
    '| Public sub sendMail_HTML_withSenderName(sFromName, sFromMail, sTo, sSubject, sTexte)
    '| Public function noBadMail(pMail, pDefault)
    '| Public function isGoodEmailCharacter(pChar)
    '| Public function containsDomain(pMail)
    je te prépare l'intégration dans les classes et créations de classes ad-hoc.
    je te propose aussi de renommer la classe Immobilis en autre chose, mais je ne sais pas encore quoi... un truc du genre FrameWorkASP

    enfin, je te propose un petit exécutable vbs qui, à partir d'une requête SQL de création de table génère une classe et 2 procédures stockées pour créer un objet, récupérer les données d'un objet et enregistrer en bases ses caractéristiques.
    Exemple : table PERSONNE avec NOM, PRENOM
    le vbs créé le code ASP de la classe suivante et les proStocks utilisées pour le GET et le SAVE
    SQL =
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE [dbo].[PERSONNE] (
    	[ID] [int] IDENTITY (1, 1) NOT NULL ,
    	[p_ARCHIVE] [bit] NULL ,
    	[p_DT_CREA] [datetime] NULL ,
    	[p_DT_MAJ] [datetime] NULL ,
    	[p_HOST] [varchar] (20) COLLATE French_CI_AS NULL ,
    	[p_ADMIN] [int] NULL ,
    	[PER_PRENOM] [varchar] (255) COLLATE French_CI_AS NULL ,
    	[PER_NOM] [varchar] (255) COLLATE French_CI_AS NULL
    ) ON [PRIMARY]
    GO
    Classe=
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    Class PERSONNE
     
        private pID
        private ConnectionString
        private oConn
        public p_ARCHIVE
        public p_DT_CREA
        public p_DT_MAJ
        public p_HOST
        public p_ADMIN
        public PER_PRENOM
        public PER_NOM
     
        public sub Class_Initialize
            ConnectionString = Application("ConnectionString")
            set oConn = Server.CreateObject("ADODB.Connection")
        end sub
     
        public sub Class_Terminate
            set oConn = nothing
        end sub
     
        public property let ID(sID)
            dim oCmd
            set oCmd=server.CreateObject("ADODB.Command")
            if sID<>"" then
                pID=sID
                oCmd.CommandText="sp_GET_PERSONNE"
                oCmd.CommandType=adCmdStoredProc
                oCmd.Parameters.Append oCmd.CreateParameter("ID",adInteger,adParamInput,,pID)
                oCmd.Parameters.Append oCmd.CreateParameter("p_ARCHIVE",adBoolean, adParamOutput)
                oCmd.Parameters.Append oCmd.CreateParameter("p_DT_CREA",adDate, adParamOutput)
                oCmd.Parameters.Append oCmd.CreateParameter("p_DT_MAJ",adDate, adParamOutput)
                oCmd.Parameters.Append oCmd.CreateParameter("p_HOST",adVarChar, adParamOutput,20)
                oCmd.Parameters.Append oCmd.CreateParameter("p_ADMIN",adInteger, adParamOutput)
                oCmd.Parameters.Append oCmd.CreateParameter("PER_PRENOM",adVarChar, adParamOutput,255)
                oCmd.Parameters.Append oCmd.CreateParameter("PER_NOM",adVarChar, adParamOutput,255)
                oConn.Open ConnectionString
                Set oCmd.ActiveConnection=oConn
                oCmd.Execute
                Set oCmd.ActiveConnection=nothing
                oConn.Close
     
                p_ARCHIVE=oCmd.Parameters(1).Value
                p_DT_CREA=oCmd.Parameters(2).Value
                p_DT_MAJ=oCmd.Parameters(3).Value
                p_HOST=oCmd.Parameters(4).Value
                p_ADMIN=oCmd.Parameters(5).Value
                PER_PRENOM=oCmd.Parameters(6).Value
                PER_NOM=oCmd.Parameters(7).Value
     
            end if
            set oCmd=nothing
        end property
     
        public sub Save 
            dim oCmd
            set oCmd=server.CreateObject("ADODB.Command")
            oCmd.CommandText="sp_UPDATE_PERSONNE"
            oCmd.CommandType=adCmdStoredProc
            oCmd.Parameters.Append oCmd.CreateParameter("ID",adInteger, adParamInput,,pID)
            oCmd.Parameters.Append oCmd.CreateParameter("p_ARCHIVE",adBoolean, adParamInput,,p_ARCHIVE)
            oCmd.Parameters.Append oCmd.CreateParameter("p_DT_CREA",adDate, adParamInput,,p_DT_CREA)
            oCmd.Parameters.Append oCmd.CreateParameter("p_DT_MAJ",adDate, adParamInput,,p_DT_MAJ)
            oCmd.Parameters.Append oCmd.CreateParameter("p_HOST",adVarChar, adParamInput,20,p_HOST)
            oCmd.Parameters.Append oCmd.CreateParameter("p_ADMIN",adInteger, adParamInput,,p_ADMIN)
            oCmd.Parameters.Append oCmd.CreateParameter("PER_PRENOM",adVarChar, adParamInput,255,PER_PRENOM)
            oCmd.Parameters.Append oCmd.CreateParameter("PER_NOM",adVarChar, adParamInput,255,PER_NOM)
            oCmd.Parameters.Append oCmd.CreateParameter("ID_BACK", adInteger, adParamOutput)
            oConn.Open ConnectionString
            Set oCmd.ActiveConnection=oConn
            oCmd.Execute
            set oCmd.ActiveConnection=nothing
            oConn.Close
            pID=oCmd.Parameters(8).Value
            set oCmd=nothing
        end sub
     
        public property get ID
            ID=pID
        end property
     
    End Class
    ProStock=
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    CREATE PROCEDURE  sp_GET_PERSONNE (
        @ID int,
        @p_ARCHIVE bit OUTPUT,
        @p_DT_CREA datetime OUTPUT,
        @p_DT_MAJ datetime OUTPUT,
        @p_HOST varchar (20) OUTPUT,
        @p_ADMIN int OUTPUT,
        @PER_PRENOM varchar (255) OUTPUT,
        @PER_NOM varchar (255) OUTPUT)
    as
        select
        @p_ARCHIVE=p_ARCHIVE,
        @p_DT_CREA=p_DT_CREA,
        @p_DT_MAJ=p_DT_MAJ,
        @p_HOST=p_HOST,
        @p_ADMIN=p_ADMIN,
        @PER_PRENOM=PER_PRENOM,
        @PER_NOM=PER_NOM
        from PERSONNE where @ID=ID
     
    et
     
    CREATE PROCEDURE  sp_UPDATE_PERSONNE (
        @ID int=null,
        @p_ARCHIVE bit=0,
        @p_DT_CREA datetime=null,
        @p_DT_MAJ datetime=null,
        @p_HOST varchar (20)=null,
        @p_ADMIN int=null,
        @PER_PRENOM varchar (255)=null,
        @PER_NOM varchar (255)=null,
        @ID_BACK int OUTPUT)
    as 
        if (select count(*) from PERSONNE where ID=@ID)=0
            begin
                insert into PERSONNE (
                p_ARCHIVE,
                p_DT_CREA,
                p_DT_MAJ,
                p_HOST,
                p_ADMIN,
                PER_PRENOM,
                PER_NOM)
                values (
                @p_ARCHIVE,
                (getdate()),
                (getdate()),
                @p_HOST,
                @p_ADMIN,
                @PER_PRENOM,
                @PER_NOM);
                select @ID_BACK=@@IDENTITY;
            end
        else
            begin
                update PERSONNE set
                p_ARCHIVE=@p_ARCHIVE,
                p_DT_MAJ=(getdate()),
                p_HOST=@p_HOST,
                p_ADMIN=@p_ADMIN,
                PER_PRENOM=@PER_PRENOM,
                PER_NOM=@PER_NOM
                where ID=@ID;
                select @ID_BACK=@ID
            end
    ce qui s'utilise comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    dim oPersonne
    set oPersonne = new PERSONNE
     
    'initialisation de l'objet (si request("id_per") = "", le .save créera un nouvel enregistrement tout seul dont l'ID sera alors accessible via oPersonne.ID)
    oPersonne.ID = request("id_per")
     
    'affichage du nom de la personne
    response.write oPersonne.PER_PRENOM & " " & oPersonne.PER_NOM
     
    'modification du prénom de la personne
    oPersonne.PER_PRENOM = request("PER_PRENOM")
    oPersonne.save
     
    set oPersonne = nothing
    Nico.
    Nico, l'agrotic géomatic

  8. #8
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,

    Ca m'a l'air très bien tout ça. Je suis curieux de voir le code.
    J'ai déplacé des fonctions, qu'en penses-tu?
    Dans la classe collection, il s'agira d'utiliser un dictionnaire pour lequel une fonction "Exist()" permet de faire le "collection_contains".
    Crois-tu que ton script de génération de class et procédures stockées peut être intégré au FW?
    Je suis d'accord pour changer le nom de la classe "Immobilis" par contre "System" me parait plus approprié, non?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    "Class HttpContext";;
    ;"Private Sub Class_Initialize";
    ;"Private Sub Class_Terminate";
    ;"Public Default Property Get DefaultProperty";
    ;"Public Property Get Count";
    ;"Public Property Get Form";
    ;"Public Property Get QueryString";
    ;"Public Property Get IsPostBack";
    ;"Public Property Get ItemByKey(key)";
    ;"Public Property Get ItemByIndex(i)";
    ;"Public Property Get KeyByIndex(i)";
    ;"Public Sub ToTable";
    ;"Public Sub ToXml(path)";
    ;"Private Sub GrabServerVariables";
    ;"Private Sub GrabApplication";
    ;"Private Sub GrabSession";
    ;"Private Sub GrabCookies";
    ;"Private Sub GrabForm";
    ;"Private Sub GrabQueryString";
    ;"Private Sub SetArrays";
    " ";;
    "Class DBFactory";;
    ;"Private Sub Class_Initialize";
    ;"Private Sub Class_Terminate";
    ;"Public Default Property Get DefaultProperty";
    ;"Public Property Let Provider(value)";
    ;"Private Property Get Provider";
    ;"Private Property Set Connection(value)";
    ;"Private Property Get Connection";
    ;"Private Property Set Command(value)";
    ;"Private Property Get Command";
    ;"Private Property Let CountRequest(value)";
    ;"Private Property Get CountRequest";
    ;"Public Function ExecuteQuery(s)";
    ;"Public Function GetRst(s)";
    ;"Public Function GetRows(s)";
    ;"Public Sub RsToTable(rs, classname)";
    ;"Public Sub SqlToTable(sql, classname)";
    ;"Public Sub RsToXls(rs, path)";
    " ";;
    "Class CFile";;
    ;"Private Sub Class_Initialize";
    ;"Private Sub Class_Terminate";
    ;"Public Default Property Get DefaultProperty";
    ;"Public Property Set File(value)";
    ;"Public Property Get File";
    ;"Public Sub DownLoad(path)";
    ;"** Public function getFileExtension(pFileName)";
    ;"** Public function getSizeAndUnit(pSize, pWithUnit)";
    " ";;
    "Class CNumbers";;
    ;"Private Sub Class_Initialize";
    ;"Private Sub Class_Terminate";
    ;"Public Default Property Get DefaultProperty";
    ;"Public Function IsDecimal(byval str)";
    ;"** Public function toZero(pNum)";
    ;"** Public function to00(pNum)";
    ;"** Public function to000(pNum)";
    ;"** Public function toDouble(pY)";
    ;"** Public function notNegative(pValue)";
    ;"** Public function format_double(pNbr)";
    ;"** Public function format_integer(pNbr)";
    ;"** Public function format_bigNumber(pNum)";
    ;"** Public function max(pA1, pA2)";
    ;"** Public function min(pA1, pA2)";
    " ";;
    "** Class CDates";;
    ;"** Private Sub Class_Initialize";
    ;"** Private Sub Class_Terminate";
    ;"** Public function DecodeMilliSecondTimer(pMilliSecond)";
    ;"** Public function get_today_ddmmyyyy ";
    ;"** Public function format_date_ddmmyyyy(pDate)";
    ;"** Public function stringDate_to_DDMMYYYY(pDate)";
    ;"** Public function format_date(pDate)	'au format ""01 janvier 2005""";
    ;"** Public function format_time_hhmm(pDate)";
    " ";;
    "Class CStrings";;
    ;"Private Sub Class_Initialize";
    ;"Private Sub Class_Terminate";
    ;"Public Default Property Get DefaultProperty";
    ;"Public Function ToProperCase(s)";
    ;"Public Function IsAlpha(c)";
    ;"Public Sub DisplayAscii";
    ;"Public Function ActivateHttp(str)";
    ;"** Public function default_value(pChaine, pValue)";
    ;"** Public function db_in(pString)";
    ;"** Public function db_out(pString)";
    ;"** Public function db_txt_in(pString)";
    ;"** Public function db_txt_out(pString)";
    ;"** Public function js_encode(pString)";
    ;"** Public function plural(pChaine, pNb)";
    ;"** Public function Generate_random_text(nbCar)";
    ;"** Public function noHTMLtag(pTxt)";
    ;"** Public function onlyLettersAndNumbers(pTxt)";
    ;"** Public function premiersMots(pTxt, pNum)";
    ;;
    "Class CSecurity";;
    ;"Private Sub Class_Initialize";
    ;"Private Sub Class_Terminate";
    ;"Public Default Property Get DefaultProperty";
    ;"Public Property Get Encryption";
    ;"Public Property Get Authentication";
    ;"** Public function Generate_login(pPrenom, pNom)";"Déplacé"
    ;"** Public function Generate_Password(nbCar)";"Déplacé"
    " ";;
    "Class CCollection";;
    ;"Private Sub Class_Initialize";
    ;"Private Sub Class_Terminate";
    ;"Public Default Property Get DefaultProperty";
    ;"** Public function collection_contains(pCollection, pItem)";"Scripting.Dictionnary.Exist()"
    " ";;
    "** Class CForms";;
    ;"** Private Sub Class_Initialize";
    ;"** Private Sub Class_Terminate";
    ;"** Public Default Property Get DefaultProperty";
    ;"** Public function size_input(pValue)";
    ;"** Public sub combo (pRS, pName, pSelect, pTexte)";
    ;"** Public sub combo_submit (pRS, pName, pSelect, pTexte, pForm)";
    ;"** Public sub input_texte (pName, pSize, pTexte)";
    ;"** Public sub input_textarea (pName, pCol, pRows, pTexte)";
    ;"** Public sub date_field(name, pSize, value)";
    ;"Public Sub RsToDDListe(rs, classname, selectedvalue, id)";"Déplacé"
    ;"Public Sub SqlToDDListe(sql, classname, selectedvalue, id)";"Déplacé"
    " ";;
    "Class CDebug";;
    ;"Private Sub Class_Initialize";
    ;"Private Sub Class_Terminate";
    ;"Public Default Property Get DefaultProperty";
    ;"Public Property Let IsDebug(value)";
    ;"Public Property Get IsDebug";
    ;"Public Property Let IsDebugTbl(value)";
    ;"Public Property Get IsDebugTbl";
    ;"Public Property Let Color(value)";
    ;"Public Property Get Color";
    ;"Public Property Let THColor(value)";
    ;"Public Property Get THColor";
    ;"Public Property Let TDColor(value)";
    ;"Public Property Get TDColor";
    ;"Public Function DWrite(value)";
    ;"Public Sub RsToTable(rs)";
    " ";;
    "** Class CEmail";;
    ;"** Private Sub Class_Initialize";
    ;"** Private Sub Class_Terminate";
    ;"** Public Default Property Get DefaultProperty";
    ;"** Public Property Let SMTP_IP(pIP)";
    ;"** Public sub sendMail(sFrom, sTo, sSubject, sTexte)";
    ;"** Public sub sendMail2000(sFrom, sTo, sSubject, sTexte)";
    ;"** Public sub sendMailCC(sFrom, sTo, sCC, sSubject, sTexte)";
    ;"** Public sub sendMail_HTML(sFrom, sTo, sSubject, sTexte)";
    ;"** Public sub sendMail_HTML_withSenderName(sFromName, sFromMail, sTo, sSubject, sTexte)";
    ;"** Public function noBadMail(pMail, pDefault)";
    ;"** Public function isGoodEmailCharacter(pChar)";
    ;"** Public function containsDomain(pMail)";
    "Winter is coming" (ma nouvelle page d'accueil)

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 202
    Points : 215
    Points
    215
    Par défaut
    salut Immobilis !

    j'ai fait l'intégration hier soir en tenant compte de tes très légères modifications.
    je n'ai pas testé le FW par manque de temps... j'espère donc que il n'y aura pas trop de pb

    tu verras, j'ai rajouté une question dans la page cls_system.asp ...


    pour le générateur de classe, je t'ai mis le .vbs dans le zip joint.
    il peut tout à fait être intégré au fw, mais côté pages d'admin seulement
    il devra alors créer le fichier class au bon endroit et les prostocks dans la bonne base ==> changer le paramètre de destination du fichier classe du vbs actuel et remplacer l'écriture du fichier contenant le SQL de la prostock en exécution dudit SQL sur la base pour laquelle on fournit la chaine de connexion.
    je te prépare ça ? une page qui utilise le FW, donc et qui transforme le SQL create en ce qu'il faut
    délais ? pas avant le début de la semaine prochaine ...

    Nico.
    Fichiers attachés Fichiers attachés
    • Type de fichier : zip fw.zip (20,9 Ko, 53 affichages)
    Nico, l'agrotic géomatic

  10. #10
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,

    Désolé, j'ai eu une coupure d'Internet alors j'ai pas pu répondre plus tôt.

    Après un premier tour d'horizon:
    1. Les variables globales sont détruites à la fin de l'execution de la page. J'ai lu sur un site de Microsoft que du coup, c'etait même pas utile de mettre un objet à "Nothing".
    2. Pour ce qui est du nommage des fonctions, que penserais-tu d'utiliser la méthode dite du dromadaire (cf FXCOP )? Les mots sont collés mais chaque initiale est en majuscule.
    3. Le tip 15 de cette page http://msdn2.microsoft.com/en-us/library/ms972335.aspx, mais aussi ici, indique qu'il vaut mieux éviter de switcher du HTML à l'ASP. Il va falloir que je reprenne la fonction "DisplayAscii"
    4. Le plus important: il faut parfois laisser le code planter. L'utilisation de "gStrings.default_value" ne doit pas se faire dans les classes, mais dans l'appel de la fonction. Si le format des données attendues par une fonction n'est pas le bon, il faut que ça plante et puis c'est tout. Sinon, ça passe et on ne sait plus d'où vient l'erreur. C'est d'ailleurs le comportement de Visual Studio en .NET ("Cannot implicitly convert type 'string' to 'int'"). Il faut être explicite. Du coup, cela rend peut-être inutile de déclarer:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      Set gStrings = New CStrings
      Set gNumbers = New CNumbers
      Non
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
       
      db_in(Request.Form("toto"))
      Oui
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
       
      MaValue = System.DB.db_in(System.Strings.default_value(Request.Form("toto"), ""))
      Avec
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
       
      public function db_in(pString)
          db_in = Replace(Replace(pString, "'", "''"),"""","""""")
      end function
    5. "noHTMLtag" je te propose ceci:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
       
      Function HTMLDecode(sText)
          Dim I
          IF not isnull(sText) THEN
              sText = Replace(sText, "& quot;", Chr(34)) ' Le colorateur syntaxique interprete &*quot;
              sText = Replace(sText, "&lt;"  , Chr(60))
              sText = Replace(sText, "&gt;"  , Chr(62))
              sText = Replace(sText, "&amp;" , Chr(38))
              sText = Replace(sText, "&nbsp;", Chr(32))
              For I = 1 to 255
                  sText = Replace(sText, "&#" & I & ";", Chr(I))
              Next
              HTMLDecode = sText
          ELSE
              HTMLDecode = ""
          END IF
      End Function
      Le colorateur syntaxique interprete &quot;
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Replace(sText, "&quot;", Chr(34))
    6. "onlyLettersAndNumbers" peut-être une expression régulière?
    7. "format_PhoneNumber" une expression régulière ou bien utiliser "Not IsNumeric()" au lieu de "unWantedChar". Peut-être faudrait-il ajouter l'information de la langue en paramètre ou dans le nom de la fonction.
    8. Les fonctions de formatage des données pour SQL sont très interessantes et indispensables. Toutefois il faudrait peut-être les mettre dans la classe DBFactory, non?
    9. La classe Email est interessante, notement le choix de la methode d'envoi. Par contre, il faudrait une propriété pour from, to, subject, etc. Ainsi, chaque methode se bornerait à affecter les valeurs aux propriétés. Par exemple, tu a une propriété "Let SMTP_IP(pIP)" mais pas "Get SMTP_IP". Tu ne devrais pas récupérer cette valeur en passant par la variable privée, mais par la propriété. On pourrait imaginer une propriété "Mailer" qui recevrait le type d'objet (CDONTS, CDO.SYS, AUTO, etc) chargé d'envoyer le mail. Ainsi, en fonction de cette valeur, il n'y aurait qu'une méthode "SendMail".
    10. Pour la génération de listes déroulantes, il faut aussi penser aux listes à séléction multiple. J'ai un code qui permet de le faire. Je le mettrai en ligne dès que possible.

    Bon, j'arrête là, attendant avec impatience tes remarques.

    Cordialement,

    Immo
    "Winter is coming" (ma nouvelle page d'accueil)

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 202
    Points : 215
    Points
    215
    Par défaut
    salut Immo,

    je te répondrai un peu tard car je serai en déplacement lundi et mardi ... il faut donc que je prépare pas mal de choses.

    a priori, tes remarques me vont en grande partie, certains points un peu moins
    je peaufine ma réflexion et te fais un retour.

    Nico.
    Nico, l'agrotic géomatic

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 202
    Points : 215
    Points
    215
    Par défaut
    salut Immo,

    comme convenu, ma petite réponse :
    Citation Envoyé par Immobilis Voir le message
    (...)
    1. Les variables globales sont détruites à la fin de l'execution de la page. J'ai lu sur un site de Microsoft que du coup, c'etait même pas utile de mettre un objet à "Nothing".

      >> agrotic : OK, rien à dire

    2. Pour ce qui est du nommage des fonctions, que penserais-tu d'utiliser la méthode dite du dromadaire (cf FXCOP )? Les mots sont collés mais chaque initiale est en majuscule.

      >> agrotic : OK, rien à dire
      je mets à jour mon code

    3. Le tip 15 de cette page http://msdn2.microsoft.com/en-us/library/ms972335.aspx, mais aussi ici, indique qu'il vaut mieux éviter de switcher du HTML à l'ASP. Il va falloir que je reprenne la fonction "DisplayAscii"

      >> agrotic : vi, un monsieur qui travaille aujourd'hui à redmond sur ASP.Net me l'avait dit aussi
    4. Le plus important: il faut parfois laisser le code planter. L'utilisation de "gStrings.default_value" ne doit pas se faire dans les classes, mais dans l'appel de la fonction. Si le format des données attendues par une fonction n'est pas le bon, il faut que ça plante et puis c'est tout. Sinon, ça passe et on ne sait plus d'où vient l'erreur. C'est d'ailleurs le comportement de Visual Studio en .NET ("Cannot implicitly convert type 'string' to 'int'"). Il faut être explicite. Du coup, cela rend peut-être inutile de déclarer:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      Set gStrings = New CStrings
      Set gNumbers = New CNumbers
      Non
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
       
      db_in(Request.Form("toto"))
      Oui
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
       
      MaValue = System.DB.db_in(System.Strings.default_value(Request.Form("toto"), ""))
      Avec
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
       
      public function db_in(pString)
          db_in = Replace(Replace(pString, "'", "''"),"""","""""")
      end function
      >> agrotic : si tu le dis
      perso, je préfère blinder que d'avoir des messages d'insulte à l'écran.
      surtout quand je rajoute ce genre de contrôles sans retoucher au code de toutes mes pages.
      ça permet d'éviter de faire du debug à tout va (enfin, je pense) ; et surtout, ça permet de gérer toutes les exceptions qui se présentent au déploiement de la nouvelle fonction.
      mais là, comme on est sur un FW, on part de zéro pour l'intégration, donc... OK ça ne devrait pas poser de problème.
      je peux mettre mon code à jour.

    5. "noHTMLtag" je te propose ceci:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
       
      Function HTMLDecode(sText)
          Dim I
          IF not isnull(sText) THEN
              sText = Replace(sText, "& quot;", Chr(34)) ' Le colorateur syntaxique interprete &*quot;
              sText = Replace(sText, "&lt;"  , Chr(60))
              sText = Replace(sText, "&gt;"  , Chr(62))
              sText = Replace(sText, "&amp;" , Chr(38))
              sText = Replace(sText, "&nbsp;", Chr(32))
              For I = 1 to 255
                  sText = Replace(sText, "&#" & I & ";", Chr(I))
              Next
              HTMLDecode = sText
          ELSE
              HTMLDecode = ""
          END IF
      End Function
      Le colorateur syntaxique interprete &quot;
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Replace(sText, "&quot;", Chr(34))
      >> agrotic : en fait, il s'agit de virer d'un texte tout ce qui est tag HTML (mise en forme, tableaux, etc...) et non pas de faire un server.htmlEncode ou ce genre de chose qui correspond plus à ta proposition
    6. "onlyLettersAndNumbers" peut-être une expression régulière?

      >> agrotic : oui, tout à fait
      j'ai fait cette fonction à la rache, donc j'ai fait super simple...

    7. "format_PhoneNumber" une expression régulière ou bien utiliser "Not IsNumeric()" au lieu de "unWantedChar". Peut-être faudrait-il ajouter l'information de la langue en paramètre ou dans le nom de la fonction.

      >> agrotic : cette fonction est arrivée avant tout un tas d'autres et du coup, s'insère pas forcément bien dans le zoo actuel. en fait, elle fait suite à une dde du mkt pour son appli CRM, histoire d'harmoniser les num de tel affichés.
      tu peux ajouter le code pays si tu souhaites. je ne l'ai pas fait car nos clients ne sont que français. (inter-profession française avec cotisation, etc...)[/COLOR]
    8. Les fonctions de formatage des données pour SQL sont très interessantes et indispensables. Toutefois il faudrait peut-être les mettre dans la classe DBFactory, non?

      >> agrotic : OK, je les déplace
    9. La classe Email est interessante, notement le choix de la methode d'envoi. Par contre, il faudrait une propriété pour from, to, subject, etc. Ainsi, chaque methode se bornerait à affecter les valeurs aux propriétés. Par exemple, tu a une propriété "Let SMTP_IP(pIP)" mais pas "Get SMTP_IP". Tu ne devrais pas récupérer cette valeur en passant par la variable privée, mais par la propriété. On pourrait imaginer une propriété "Mailer" qui recevrait le type d'objet (CDONTS, CDO.SYS, AUTO, etc) chargé d'envoyer le mail. Ainsi, en fonction de cette valeur, il n'y aurait qu'une méthode "SendMail".

      >> agrotic : OK, qui la fait ?
    10. Pour la génération de listes déroulantes, il faut aussi penser aux listes à séléction multiple. J'ai un code qui permet de le faire. Je le mettrai en ligne dès que possible.

      >> agrotic : bien noté
    je retravaille ça ...

    Nico.
    Fichiers attachés Fichiers attachés
    Nico, l'agrotic géomatic

  13. #13
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,

    Je fais un tour et je te dis.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 202
    Points : 215
    Points
    215
    Par défaut
    so Immo ... no news, bad news ?
    Nico, l'agrotic géomatic

  15. #15
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut

    Salut,

    En fait, ça prend pas mal de temps!!
    J'ai déjà commencé une réponse y'a un certain temps. Mais je j'arrive pas à terminer. J'hésite, est-ce que je te mets le début?

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

  16. #16
    Membre actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 202
    Points : 215
    Points
    215
    Par défaut
    vas-y,

    comme ça on avancera plus vite
    Nico, l'agrotic géomatic

  17. #17
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Salut,
    Citation Envoyé par agrotic Voir le message
    vi, un monsieur qui travaille aujourd'hui à redmond sur ASP.Net me l'avait dit aussi
    Tu as des contact là-bas ou Bill est ton copain?
    Citation Envoyé par agrotic Voir le message
    perso, je préfère blinder que d'avoir des messages d'insulte à l'écran.
    Hélas, en ASP y'a pas de solution à part une page d'erreur par défaut paramétrée dans IIS.
    Citation Envoyé par agrotic Voir le message
    en fait, il s'agit de virer d'un texte tout ce qui est tag HTML (mise en forme, tableaux, etc...) et non pas de faire un server.htmlEncode ou ce genre de chose qui correspond plus à ta proposition
    Ah oui, c'est vrai, j'ai pas bien regardé la fonction. Ok.
    Citation Envoyé par agrotic Voir le message
    OK, qui la fait ?
    En parlant de la classe Email, ben comme tu veux. On peut y réfléchir chacun de son côté et faire des propositions

    Il faut absolument qu'on créé un script qui teste toutes les propriétés les unes à la suite des autres!
    1. Class CCollection
      1. La collection dans ce cas est une chaine de caractères. Un InStr() suffirait non? Sinon, on peut ajouter un "Exit Function"
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        Public Function CollectionContains(pCollection, pItem)
        	Dim pSplitted, pI
        	pSplitted = split("," & replace(pCollection, " " , "") & ",", ",")
        	CollectionContains = False
        	For pI = 0 to uBound(pSplitted)
        		If pSplitted(pI) <> "" and not CollectionContains Then
        			CollectionContains = (cStr(pSplitted(pI)) = cStr(pItem))
        			Exit Function
        		End If 
        	Next
        End Function
    2. Class CDates
      1. Renommage de la classe "CDates" en "CDatesTime"
      2. A moins que ce soit une nécessité d'avoir les millisecondes, la fonction "DecodeMilliSecondTimer" peut être remplacée par
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        FormatDateTime(pMilliSecond/86400000, 3)
        Par contre il ne s'affiche pas les millisecondes.
      3. Les fonctions de conversion de date sont interessantes mais elles tiennent uniquement compte de la culture FR. Je ne suis pas trop pour les mettre dans un FW qui se voudrait générique. A moins d'y adjoindre la notion de culture. A mon avis, la gestion des dates affichées chez le client doit être neutre pour laisser le LCID ou les langues supportées par le navigateur fonctionner. Qu'en penses-tu?
      4. Plutôt que d'utiliser une variable globale, je verrais plutôt un propriété référençant l'objet "Strings" de la classe "System"
    3. Class CFile:
      1. Remplacement de:
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        ' récupération de l'extension d'un fichier
        '+-------------------------------------------------------
        Public Function GetFileExtension(pFileName)
            Dim pSplitted
            If pFileName = "" Then
                getFileExtension = "xxx"
            else
                pSplitted = split(pFileName, ".")
                getFileExtension = pSplitted(uBound(pSplitted))
            End If
        End Function
        Par
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        Public Function GetFileExtension(pPath)
            GetFileExtension = File.GetExtensionName(pPath)
        End Function
    4. Class CSecurity:
      1. Suppression de:
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        <!--#include file="cls_Encryption.asp" -->
        N'était pas fini dans ma première version => générait une erreur car déjà inclus dans cls_System.asp
      2. Suppression de:
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        Public Property Get Encryption
        	If m_Encrypt Is Nothing Then
        		Set m_Encrypt = New CEncryption
        	End If
        	Set Encryption = m_Encrypt
        End Property
        Pas utilisé.
      3. Mise en propriété de:
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        Public Property Get Strings
        	If m_String Is Nothing Then
        		Set m_String = New CStrings
        	End If
        	Set Strings = m_String
        End Property
        Pour rendre l'objet disponible pour toute la classe lors du premier appel de "GenerateLogin"
      4. Correction de "GenerateLogin" en conséquence:
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        Public Function GenerateLogin(pPrenom, pNom)
        	GenerateLogin = lCase(left(Strings.Desaccentue(Strings.OnlyLettersAndNumbers(Strings.DefaultValue(pPrenom, ""))), 1) & Strings.Desaccentue(Strings.OnlyLettersAndNumbers(Strings.DefaultValue(pNom, ""))))
        End Function
      5. Suppression de "GeneratePassword" au profit de "RandomString" (plus court) dans la classe CString:
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        ' texte aléatoire, pas de confusion entre le chiffre 0 et la lettre O
        '+-------------------------------------------------------
        Public Function RandomString(nbCar)
            Dim vocab, temp, i
            vocab = "AZERTYUIOPMLKJHGFDSQWXVCBN123456789azertyuiopqsdfghjklmwxcvbn"
            temp = ""
            randomize
            For i = 1 to nbCar
                temp = temp & Mid(vocab, rnd() * len(vocab) + 1, 1)
            Next 
            RandomString = temp
        End Function
    5. Toutes les classes:
      1. correction "Proper Case" (Dim, Function, Public, ...) et "CamelCase" (chameau pas dromadaire )
      2. Modification de la propriété par défaut:
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        DefaultProperty = typename(Me)
    Fichiers attachés Fichiers attachés
    "Winter is coming" (ma nouvelle page d'accueil)

  18. #18
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 506
    Points
    9 506
    Par défaut
    Je me demandais si il ne faudrait pas prendre chacun en charge l'intergration d'une partie.

    Qu'en penses-tu?

    J'ai ajouté une page "Console.asp". Elle permet de controler une peut le framework. Je te laisse tester.

    A+
    "Winter is coming" (ma nouvelle page d'accueil)

Discussions similaires

  1. Existe t-il un framework MVC pour mon besoin ?
    Par Lagoon94 dans le forum Bibliothèques et frameworks
    Réponses: 25
    Dernier message: 29/04/2011, 12h16
  2. [AJAX] Existe t-il un framework AJAX pour les JSP?
    Par solawe dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 18/08/2008, 17h08
  3. Existe t'il un framework pour programmation orienté plugins
    Par toure32 dans le forum Plateformes réactives et architectures modulaires
    Réponses: 2
    Dernier message: 12/06/2008, 08h26
  4. Réponses: 3
    Dernier message: 07/09/2007, 09h54
  5. [ORM] Existe-t-il un framework complet ?
    Par amazircool dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 23/05/2007, 22h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo