Ajax: dalla RC alla RTM --> un incubo!!!

Sono in ufficio alle 7,30 e leggo che ieri è stata rilasciata la versione definitiva di Ajax. Bene, andiamo con l'aggiornamento. Mi scarico l'installazione. Leggo le tips da seguire per l'aggiornamento, quindi disinstallo la versione RC e procedo con l'installazione della RTM. Tutto liscio come l'olio. Apro Visual Studio, apro il mio progetto, e vado per aggiornare il web.config...... ahhhhhhhhhh!!!!!!!!!!!!!! Con mio orrore scopro che non posso o non riesco a cliccare sulla toolbox dell'esplora soluzione, subito non ci credo, quindi chiudo VS e riapro, stesso risultato. Allora con calma disinstallo la RTM e riprovo l'installazione, risultato lo stesso. Impossobile cliccare su una qualunque delle toolbox. Chiudo la mia soluzione e provo a fare un nuovo progetto AJAXEnabledWebApplication, progetto creato correttamente ma di nuovo impossibile clicca, assurdo. Risultato, disinstallo la RTM e rimango in attesa, non so bene di cosa. Forse qualcuno avrà il mio stesso problema. Adesso sto postando sul forum di ajax.net vediamo un po' come finisce sta cosa.

Google dipendenza

Sono da sempre una persona di facili entusiasmi e nel lavoro non faccio certo differenza. Eccomi quindi a riflettere, così quasi per caso, sui vari software che ogni giorno utilizzo per il lavoro. Tralasciando VS, mi sono reso conto che ho praticamente eliminato il messenger a favore di GTalk, per le ricerche uso l'immancabile Google Desktop, Outlook e quasi sempre chiuso mentre Gmail sempre aperto, ho eliminato tutti i software di aggregazione usando solo il reader di Google, i gruppi di discussione li ho spostati da Outlook Express a Google, infine ho brasata WebTrends a favore di Google Analytics. Tutto ciò è normale!? Penso di sì, sarà la moda, sarà che alla fine in qualunque posto di lavoro mi trovo (dentro e fuori dall'ufficio) ho tutte le risorse che mi servono, non so cosa sia fatto sta che sto diventanto Google dipendente.

[OT] Caos o quasi

Di base sono una persona ordinata ma non sul lavoro, sopratutto quando si parla di scrivania.
Volevo quindi farvi partecipi del caos che regna sulla mia in una normale giorno di lavoro.

Google rules!

Non so se è già capitato a qualcuno di voi, però a me è la prima volta che un baco di programmazione viene per così dire messo in evidenza da google. In pratica: poco prima delle ferie di agosto ho aggiornato un database di un portale di un mio cliente, nuove funzionalità, dati aggiornati ecc., poi bello tronfio parto per le ferie ed al mio ritorno ecco i primi problemi. Mi vengono segnalati dei forti rallentamenti sul server web. Pensa e te ripensa, all'inizio non davo troppo peso alla cosa, anche perchè i problemi erano veramente sporadici in più su quel server gira una nuova applicazione ancora in beta che gestisce l'extranet del cliente. Nelle ultime settimane però la cosa si è fatta preoccupante, diversi processi in lock su SQL, IIS rallentato, CPU spesso al 100%..... insomma un vero casino. Dopo averle provate tutte ecco che finalmente i nodi vengono al pettine e il risultato è il seguente: la copia cache dell'ultima indicizzazione di google puntava a certe schede prodotto ormai obsolete e non più presenti a db, il risultato è che quando il robots girava per l'indicizzazione del sito il tutto andava in blocco. Soluzione: con un semplice if il baco nel codice è stato risolto. Grazie Google.

I primi 3 giorni della settimana

Lunedì: lavoro come un negro con il mio bel progettino e faccio tutto quello che devo fare.

Martedì: iniziano i primi problemi, il debug di VS non va più, riavvio server, pc, router, hub, firewall, insomma riavvio il mondo e non va. Poche saracche (+ discreto).

Mercoledì: come per magia il debug è ripartito, che cose belle che sono queste.

Un datagrid per ogni riga di un datagrid

La necessità: per ogni riga di un datagrid visualizzare una datagrid con informazioni esplose.
La soluzione: girovagando un po' in giro ho trovato diverse soluzioni sul Master and Detail Datagrid, perfino qualcuno che si è creato a proprio uso e consumo un controllo personalizzato.
Io ovviamente non ho nè il tempo nè le capacità, quindi risolvo più artigianalmente in questo modo.

Lo scenari per varie motivi che non sto ad elencare, mi trovo costretto a dover visualizzare dei blocchi di record, a 3 a 3, relazionati tra loro attraverso apposita tabellina di sql.

Partiamo quindi dal codice del pageload:

strlSQL = "SELECT ID FROM tblRelationship WHERE Divisione = @Divisione AND NOT Stato ='3'"

Dim da As New SqlDataAdapter(strSQL, conn)
dsRelationship = New DataSet
da.Fill(dsRelationship, "miaTabella")

grdTEST.DataSource = dsRelationship
grdTest.
DataKeyField = ID
grdTEST.DataBind()

Ottengo così il datagrid popolato di ID.
Adesso passiamo ad implementare la funzioncina che per ogni riga mi interroga il db popolandomi un bel datagrid:

Protected Function getOrdersDataSource(ByVal _ID As String) As DataView
   Dim strSQL As String = "SELECT Fields FROM tblMiaTabella WHERE sr.ID = @ID AND sp.Divisione = @Divisione "

   Dim conn As SqlConnection
   conn = New SqlConnection(ConfigurationSettings.AppSettings("conn"))
   Dim ds As DataSet
   Dim daRel As New SqlDataAdapter(strSQL, conn)
   ds = New DataSet
   daRel.Fill(ds, "ds")
   Return ds.Tables(0).DefaultView
End Function

A questo punto personalizziamo il codice HTML.

<asp:DataGrid id="grdTEST"  AutoGenerateColumns="False" runat="server">
       <Columns>
        <asp:TemplateColumn HeaderText="ID">
         <ItemTemplate>
          <asp:Label Runat="server" Text='<%# Container.DataItem("ID") %>' ID="lblID"></asp:Label>
         </ItemTemplate>
        </asp:TemplateColumn>
        <asp:TemplateColumn>
         <ItemTemplate>
          <asp:DataGrid runat="server" AutogenerateColumns="False" DataSource='<%# getOrdersDataSource(DataBinder.Eval(Container.DataItem, "ID")) %>' ID="grdRow">
            <Columns>
                 [... template column]
            </Columns>          
          </asp:DataGrid>          
         </ItemTemplate>
        </asp:TemplateColumn>     
       </Columns>
</asp:DataGrid>

Application Block assolutamente micidiali!

Questa mattina mi chiedono di implementare su un sito di un cliente un sistema molto semplice di scontistica applicato all'input di un codice promozionale.
Niente di più semplice dico io.
Scrivo la mia bella store procedure per verificare la correttezza del codice digitato:

CREATE PROCEDURE dbo.uspCheckBuonoAcquisto
@CS nvarchar(6),
@Esito nvarchar(6)
output

AS

IF EXISTS(SELECT field FROM Table WHERE field = @CS)
      SET @Esito = 1
ELSE
      SET @Esito = 0
RETURN

Poi passo a modifica la classe che gestisce l'ordine inserendo intanto una funzioncina per la validazione del codice:

Public Shared Function CheckBuonoAcquisto(ByVal strCodice As String) As Boolean

Dim ParamList(1) As SqlParameter
ParamList(0) =
New
SqlParameter("@CS", SqlDbType.NVarChar, 6)
ParamList(0).Value = strCodice
ParamList(1) =
New
SqlParameter("@Esito", SqlDbType.NVarChar, 6)
ParamList(1).Direction = ParameterDirection.Output

SqlHelper.ExecuteNonQuery(ConfigurationSettings.AppSettings("cs"), CommandType.StoredProcedure, "uspCheckBuonoAcquisto", ParamList)

If ParamList(1).Value = 0 Then
      Return
False
Else
      Return
True
End If

End Function

Con mio assoluto sconcerto mi accorgo che il parametro ParamList(1) è praticamente sempre null, qualuque cosa succeda nella store procedure.
Dopo aver rotto l'anima a destra e a manca, trovo un bel post in un forum che spiega una cosa bellissima; praticamente richiamando il metodo ExecuteNonQuery nel modo più semplice, che è quello che uso normalmente 
SqlHelper.ExecuteNonQuery(sqlConnectionObjectGoesHere,  "StoredProcedureNameGoesHere",  parameters) tra le controindicazioni leggo:  You cannot use "output" parameters or "return_value" parameter.
Rimango sconcertato...
Mi accingo quindi a modificare la funzione con la nuova sintassi:  SqlHelper.ExecuteNonQuery(sqlConnectionObjectGoesHere, CommandType.StoredProcedure, "StoredProcedureNameGoesHere", parameters) e voilà il tutto funziona perfettamente.

Definizione di Tooltip

Stamattina preso da un raptus di follia mi rendo conto che ignoro il significato di tooltip.
I pensieri sono i più svariati, ma tutti hanno in comune la prospettiva di un concetto complicatissimo, del resto ignorando la cosa non sapevo cosa aspettarmi, chiaro no?!

Decido quindi di scrivere un'umile email al mio mentore per chiedere lumi...
In risposta ricevo una comunicazione solo grafica contenente questa immagine:

Non contento ricerco in rete "what is tooltip" e trovo codesta definizione:  Piccola etichetta gialla che in un programma descrive le funzioni della barra dei pulsanti.

L'ignoranza è una brutta cosa.

«November»
SunMonTueWedThuFriSat
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789