dimecres, 26 d’octubre del 2011

Consulta SQL per veure totes les opcions d'una plantilla i quines estan marcades

Quan ens trobem que he fer una consulta d'una taula on per una determinada opció cal saber si està marcada o no, moltes vegades ho fem de la següent manera:

    ColParametres=TornaTotsElsParametres()
    for each Parametre in ColParametres
        if MiraSiElClientTeElParametreMarcat(codi_client, codi_parametre) then
            'parametre marcat
        else
            'parametre NO marcat
        endif
    next Parametre

Mostrant la taula de la següent manera:


Això comporta el problema que la funció MiraSiElClientTeElParametreMarcat() també fa un accés a la base de dades, i fem aquest accés per cada paràmetre de la llista. Per tant accedim a la base de dades tantes vegades com paràmetres tenim a la taula base.

Una millor manera de fer-ho, suposant que la taula "Paràmetres" té els camps "codi_client", "codi_parametre"; seria fent una consulta única de la següent manera:


    SELECT Codi_Parametre, Descripcio
    (SELECT Codi_Parametre FROM Parametres_Clients
    WHERE Codi_Client = 'codidelclient'
    AND codi_parametre=Parametres.Codi_Parametre) AS Codi_Parametre_Client"
    FROM Parametres

LLavors el codi quedaria com:

    if tb!Codi_Parametre_Client Is Null then
        'parametre No marcat
    else
        'parametre marcat
    endif

dilluns, 24 d’octubre del 2011

Accedir via "for each" a una colecció en VB6

A vegades quan programem amb VB6, ens trobem que no podem accedir a una coleccio personalitzada via "for each". Aquesta funció no rutlla:


Public Property Get NewEnum() As IUnknown
    'esta propiedad permite enumerar
    'esta colección con la sintaxis For...Each
    Set NewEnum = mCol.[_NewEnum]
End Property

Per poder accedir via "for each" cal seleccionar la paraula "NewEnum" i anar a l'opció de menú "Herramientas" --> "Atributos del procedimiento..." i un cop al formulari clicar el botó "Abanzados >>". Un cop desplegades les opcions avançades, cal comprovar que segurament no tens un -4 en el "Id. del procedimiento" ni tens la opció marcada de "Ocultar este miembro". Un cop arreglat això ja podràs accedir a la colecció via "for each".