Che non si sa mai, potrebbero servire a qualcuno:
Per oggi Webform
- Framework Ajax ... lo so esiste l'ex Atlas, ma lo uso da quando ancora Atlas non era nato e devo essere sincero preferisco far le cose a mano, e poi è più performante (in quanto a banda e velocità pura) AjaxPro.net
- Charting, è un componente a pagamento (io lo uso per una intranet quindi la scritta "not for production" non mi tedia troppo) ma funziona bene DotNetCharting
- Map component, se vi piace google map e non volete impazzire con i javascript vi consiglio questo, esiste la versione free e quella a pagamento ... indovinate quale uso? GoogleMap
- Rich editor web, un controllo conosciutissimo ma che comunque segnalo Freetextbox
Per la cronaca Tiscali latita ancora, prima era colpa Telecom ... adesso salta fuori che "no il problema è nostro, ci metteremo una decina di giorni"... taccio perchè imprecare in un blog non è carino.
Lo so, molti di voi saranno consulenti esterni e quindi vi sentirete punti nel vivo.
Ma ODIO i call center, odio i risponditori automatici.
Ma andiamo per ordine:
Martedì smette di funzionare la mia linea ADSL (tiscali) , vabbè può capitare no?
Chiamo il 130 e dico, "ma sì parliamo con un umano...." , dopo 15 min di musichetta mi rendo conto che forse l'umano non esiste.... allora segnalo il guasto al risponditore automatico.
Mi mandano l'sms di notifica "Lavori terminati"
Torno a casa .. proviamo .. figo va!
Mercoledì accendo il router e indovina? Niet niente segnale ...
Riborda il 130 .. riborda segnalazione guati ... messaggio strafigo "Abbiamo fatto tutto"
ma niente linea ...
Sono 5 giorni che non non va, e sono 5 giorni che tento di parlare con un essere umano e non ci riesco, capisco che non sia possibile gestire tutto da tiscali, soprattutto su tutto il territorio...
Ma voglio dire, sti ca##o di call center assumono 50 persone (assumono è un eufemismo) prive di qualunque diritto e di qualunque garanzia ... tralasciamo i discorsi su diritto del lavoro ecc ma con queste condizioni (all'interno dei call center) io PRETENDO e ripeto:
PRETENDO
Di essere ascoltato e servito da una persona fisica.
Do altri 3 gg a tiscali (ho fatto la segnalazione anche sul sito), dopodichè prevedo un cordiale (nemmeno tanto) Vaffanculo a tiscali e considerando che ho il contratto con loro da meno di un anno prevedo pure grosse litigate ma ribadisco Vaffanculo i disservizi posso accadere ma sto genere di trattamento non lo concepisco.
Scusate lo sfogo.
Esperienza ... quella che mi manca in diversi campi..
Mi trovo nella condizione di dover analizzare la fattibiltà di un progetto per il controllo della disponibilità e la prenotazioni di oggetti da uno Stock, per fare questo dovrei (vorrei e spererei) utilizzare un palmare PocketPc (windows mobile 5 spero) con un lettore di codice a barre.
Questo non sarebbe un problema visto che il framework per il pocket è ben fatto, il problema è che non voglio che ogni palmare abbia un suo db all'interno quindi ho optato per far accedere il palmare a un WebService tramite WiFi (con modulo già presente nel palmare).
Leggendo in giro sembra che la cosa sia fattibile, ma come dicevo sopra non avendo esperienza con palmari "moderni" (ho programmato con successo vari vecchi iPaq 3630 che ancora posseggo e uso) e con i relativi accessi a hotspot non so quanto sia funzionale, come del resto, non ho esperienza sul lettore che potrei associare al palmare, un intermec all in one costa minimo 1300 invece un dell con schedina si attesta intorno agli 800.
Avete qualche esperienza o dritta?
... magari lavorate all'intermec e potete farmi un prezzaccio...
Leggendo questo post di Raffaele mi sono domandato: è giusto mettersi sotto per sviluppare un tool che genera classi (o più in generale una struttura) partendo da una serie di tabelle dal database?
Quello che dice Raffaele è tutto più che giusto, solo che secondo me non prende in considerazione alcuni aspetti:
- Piccole applicazioni sul piccoli database (parlo di 10 / 15 tabelle) con struttura relativamente poco normalizzata, non per errori di design ma per tipo problema da affrontare
- Rappresentazione di strutture astratte dalle tabelle, per esempio posso prendere i dati da una vista (o da una stored piuttosto che un query) inserendone i valori nelle varie property e al momento dell' update/save "spalmare" i dati sulle varie tabelle che devono essere aggiornate.
- Velocizzare e rendere strutturato l'accesso e la gestione di un problema che altrimenti verrebbe scritto senza utilizzare questa divisione tra interfaccia e database (mica tutti sono esperti di metodologie di sviluppo...)
Partendo da questo ho deciso di variare l'approccio al progetto rimuovendo gli automatismi che avevo in mente e puntando a far creare delle classi che oltre a contenere i vari campi della sorgente dati (viste, tabelle, stored ecc) genera delle property alle tabelle collegate (non quelle definite nel db ma quelle definite all'interno dell'applicazione).
Selezionate le stored da utilizzare per Select/Update/Delete genera i metodi (con tanto di parametri già dichiarati) necessari al loro utilizzo , ma non genera il codice vero e proprio per il loro utilizzo, permettendo (tramite xslt) l'implementazione della metodologia preferita.
Intanto metto su qualche immagine del progetto (ancora in fase alpha):
La connessione alla sorgente dati
Le relazioni tra le teabelle
I settaggi per la generazione del codice
La selezione della stered procedure e i parametri
Infine il codice generato.
E questo è uno spezzone di codice xlst per la generazione del codice (solo i membri privati e le property altrimenti era troppo lungo).
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
Public Class <xsl:value-of select="TableSchema/TableName" />
<xsl:for-each select="TableSchema/Columns/Column">
Private m<xsl:value-of select="ColumnName"/> As <xsl:value-of select="ColumnType"/>
</xsl:for-each>
<xsl:for-each select="TableSchema/LinkedTables/Table">
Private m<xsl:value-of select="Name"/>List As List (Of <xsl:value-of select="Name"/>)
</xsl:for-each>
#Region "Property List"
<xsl:for-each select="TableSchema/Columns/Column">
Public Property <xsl:value-of select="ColumnName"/>() as <xsl:value-of select="ColumnType"/>
Get
Return m<xsl:value-of select="ColumnName"/>
End Get
Set (ByVal Value As <xsl:value-of select="ColumnType"/>)
m<xsl:value-of select="ColumnName"/>=Value
End Set
End Property
</xsl:for-each>
<xsl:for-each select="TableSchema/LinkedTables/Table">
Public Property <xsl:value-of select="Name"/>List() As List (Of <xsl:value-of select="Name"/>)
Get
Return m<xsl:value-of select="Name"/>List
End Get
Set (ByVal Value As <xsl:value-of select="Name"/>)
m<xsl:value-of select="Name"/>List=Value
End Set
End Property
</xsl:for-each>
#End Region
End Class
</xsl:template>
</xsl:stylesheet>
ps. Grazie Cristian per il codice, molto utile.
Ed ecco il primo "snippets"
Se vi dovesse capitare la necessità di enumerare gli oggetti di un database (tabelle, stored, views ecc) esistono diversi metodi:
Il primo è accedere alla tabella (nel db master se si usa sql server) contenente la struttura del database, ma per farlo dovete sapere a prescindere il provider altrimenti rischiereste di ottenere cose errate o non ottenere niente.
Il secondo è utlizzare il metodo GetOleDbSchemaTable dell'oggetto connection Oledb con la seguente sintassi:
Dim cn As New OleDb.OleDbConnection
Dim schemaTable As DataTable
Dim row As DataRow
schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, New Object() {Nothing, Nothing, Nothing, "TABLE"})
For Each row In schemaTable.Rows
TableName = row("TABLE_NAME").ToString
Next row
Scusate la formattazione, ma non sono ancora avvezzo a live writer.
Comunque ... cambiando lo OleDbSchemaGuid potrete selezionare oggetti diversi e variando il secondo parametro con un array diverso potrete selezionare un oggetto preciso invece di ottenerne la lista.
Per esempio se voleste ottenere la lista dei parametri di una store procedure dovreste scrivere questo pezzo di codice:
dtParameters = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Procedure_Parameters, New Object() {Nothing, Nothing, spName, Nothing})
sostituite spName al nome della stored e il gioco è fatto.
Eccoci qua, dopo vari tentennamenti anche dovuti alla mancanza di tempo riesco ad aprire e spero gestire (perdonate l'incostanza ... ma il tempo è quello che è .. per tutti) un blog su UGI.
Leggo molti blog provenienti da questa "community" partendo da Lorenzo , Igor , Raffaele e Giorgio solo per citarne alcuni, tutti molto utili e soprattuto più tecnici rispetto a quelli che, al momento, penso di pubblicare.
Sarò poco tecnico, vi sarà molta pratica, molti snippets e simili, mi dispiace al momento di non essere molto ferrato su argomenti come Programmazione Agile, MVC etc ma spero di aver un po di tempo per studiare a modo..
E queste erano le buone intenzioni...
I progetti o meglio il progettino ,perchè di questo si tratta al momento, è sicuramente cosa trita e ritrita ma si tratta di generare delle classi in automatico partendo dal database... (sto ancora pensado il nome)
Sarò il milionesimo? Certo!
Ma sono così, mi piace far le cose alla mia maniera e quindi son partito da un presupposto ... il dataset designer di vs2005 non mi piace ... quindi partiamo da zero.
La mia idea è quella di rendere la generazione del codice "scriptabile".. o meglio "stilizzabile", ma procediamo per passi.
Il primo elemento, l'accesso alla base dati.
Per rendere la cosa più indipende e modulare possibile ho creato una libreria ConnectorTemplate che espone una serie di classi e metodi che se implementati e ereditati permette l'accesso, il test della connessione e l'enumerazione degli oggetti presenti nel database e altro che vedremo in seguito.
Questo è fattibile con una struttura a plugin, il vostro plugin (una dll) penserà a connettersi, ottenere tale struttura e compilare le collection di oggetti richiesti.
Ottenuta la lista delle Tabelle (per ora son fermo qui), Colonne, indici ecc si tratterà di selezionare quelli che ci interessano per la creazione del nostro layer.
Per adesso mi fermo qui, almeno ho qualcosa da scrivere (la cosa potrebbe essere lunga), nel frattempo guardo se codeplex ha disponibilità ad ospitare il progetto e come funziona il servizio.
Ps. Il progetto utilizza una libreria esterna ma opensource per la visualizzazione e highlight del codice (.Net Fireball) più una libreria scritta da me (da terminare .. anzi diciamo da iniziare) per la rappresentazione grafica del database, comprese le relazioni.
PPs. Sennò la cosa può sembrare pallosa: il codice generato è definito tramite XSLT in modo da permettere la definizione di stili personali, linguaggi diversi da c# e vb.net e soprattuto l'implementazione di Design Patterns.
Per adesso saluti, spero che a qualcuno interessi e che voglia betatestare il tutto (chiaramente sarà compreso di codice), quando sarà un po più che in Alpha.