Gambas-it

Programmazione => Progetti degli utenti => Topic aperto da: perseo - 12 Ottobre 2010, 12:40:08

Titolo: Gestionale Perseo
Inserito da: perseo - 12 Ottobre 2010, 12:40:08
Eccomi al mio primo post...

Spero di non fare troppi voli pindarici e di riuscire a spiegarvi a grosse linee il mio progetto.

Premessa:
Avevo già creato un gestionale per il mio ufficio in VB6 e DB_Access, altamente personalizzato... Funziona abbastanza bene, ma chiaramente, essendo stata la mia prima esperienza, il codice è pesante e tante cose non le sapevo. Non che ora ne sappia di più, ma almeno spero di migliorarlo ...in Gambas.
Il mio intento è di upgradare anche in ufficio da Winzoz a Linux (Ubuntu), laddove sia possibile. Purtroppo alcuni software proprietari di alcuni nostri macchinari girano solo su Winzoz e quindi dovrò adeguarmi pian piano.

Progetto:
Si tratta di due PC, in rete locale, dove il flusso di lavoro si articola così:
PC_1 --> gestisce le domande di lavoro: accettazione clienti, archivio clienti, ecc. --> quindi lo uso come PC_main, dove si trova anche il DB.
PC_2 --> compila ed esegue liste di lavoro, inserimento dati, ecc. --> e quindi popola il DB con i dati, ecc. Questo secondo PC pesca altri dati anche da altri due PC (Windows), dei macchinari con i software proprietari (che usano DB Access)

Quando tutte le richieste di lavoro sono state svolte ed immesse attraverso il terminale PC_2, dal PC_1 si emettono fatture, ecc.

Note:
1) Ho installato Gambas3 perché da quanto capito, è prossima la versione Beta ufficiale, e se ho capito bene questa Alpha non dovrebbe darmi problemi... Giusto
2) Vorrei usare SQLite3 come DB
3) Per i Report di Stampa credo che userò PDF-Writer (ma ancora devo leggere la documentazione relativa)

Domande:
1) E' possibile che il DB sia aperto contemporaneamente sui 2 PC_1 e PC_2 senza avere problemi di conflitto. Mi pare che VB6 e DB_Access gestivano la cosa in maniera automatica senza che io intervenissi nel codice. Cioè se su PC_1 e PC_2 lavorano contemporaneamente sulla stessa tabella, devo in qualche modo prevenire possibili errori/conflitti?

2) E' possibile pescare i dati da DB_Access del PC Winzoz (in rete) attraverso Gambas e trasferisli nel mio DB SQLite.

3) E' possibile configurare dei profili utenti di gestione del software? Ossia il PC_1 (utenteA) può fare solo determinate operazioni mentre dal PC_2 (utenteB) se ne fanno altre (rendendo "unvisible" alcune voci del menù o alcuni pulsanti)? Vorrei inserire anche un profilo Admin (io) in grado di avere libero accesso a tutto il software... e che chiaramente può decidere "chi può usare cosa"...
L'idea è che ognuno abbia una propria password ed effettui il login all'avvio. Ed in base all'utente l'Admin decide di assegnargli un profilo (ad esempio l'utenteB (che lavora prettamente sul PC_2) potrebbe loggarsi ed usare anche il PC_1... e viceversa l'utenteA... ma sempre ed esclusivamente per le attività consentiti dal loro profilo...)

Questo mi serve perché vorrei settorializzare il Gestionale, ma con la possibilità di usarlo interamente come Admin da ogni postazione.

4) Ho fatto bene a passare subito a Gambas3?


Ne avrei tante altre ma vorrei procedere con ordine (spero)!

 :)

PS: un grazie particolare a Dex che mi ha fatto scoprire questa comunity!

PPS: un altro a f.surfing per la guida Gambas & SQlite.

PPPS: avevo provato ad installare Gambas3 dal post Repository_SVN ma mi ha dato un errore strano, quindi ho provveduto a fare tutto da terminale.
Titolo: Re: Gestionale Perseo
Inserito da: Ceskho - 12 Ottobre 2010, 12:47:42

1) Se apri e chiudi la connessione per ogni modifica è difficile che tu ti imbatta in qualche problema....un controllo in più comunque non fa mai male...anzi..

2) devi convertire i dati in maniera che possano essere interpretati..qui sta a te scegliere come...

3) Certo che si può fare...devi solo scegliere come....

4)  Se hai scelto gambas 3 può andare bene ma tieni presente che finchè non viene rilasciato come stabile allora potrebbero cambiare tante cose...tienilo presente.
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 12 Ottobre 2010, 13:03:55
Grazie Ceskho!  :2birre:

1) Il mio dubbio è se disgraziatamente due utenti modificano contemporaneamente la stessa tabella del DB. Oppure anche la situazione in cui uno modifica e l'altro è in sola lettura... Come si gestiscono questi controlli... nel senso... sai dove posso trovare una documentazione adeguata di questi problemi?  :)

2) Cioè... Potrei aprire il DB Access, memorizzare i dati che mi intressano in delle variabili e poi riassegnarle al DB SQlite?

3) Pensavo attraverso la creazione di Profili, e che ad ogni profilo corrisponda la possibilità di cliccare su delle voci di menù. Chiaramente ogni utente avrà la sua PaginaMain (che è sempre la stessa, ma settata in base al profilo). Ad esempio: l'UtenteA non ha abilitati determinate voci del menù, mentre l'UtenteB ne ha abilitate altre, e l'Admin le vede tutte...
Potrebbe andare? o mi consigli un metodo differente e più performante?

4) Ho pensato che il rischio ne valesse la candela. Farlo in g2 e poi tra due mesi esce la g3 mi sembra  :bad:. Oppure i cambiamenti potrebbero essere sostanziali e radicali?  :-\
Titolo: Re: Gestionale Perseo
Inserito da: Golia - 12 Ottobre 2010, 13:29:40
Citazione
1) Ho installato Gambas3 perché da quanto capito, è prossima la versione Beta ufficiale, e se ho capito bene questa Alpha non dovrebbe darmi problemi... Giusto
A parere mio fai bene incominciare con Gambas3.
Citazione
2) Vorrei usare SQLite3 come DB
Citazione
Domande:
1) E' possibile che il DB sia aperto contemporaneamente sui 2 PC_1 e PC_2 senza avere problemi di conflitto. Mi pare che VB6 e DB_Access gestivano la cosa in maniera automatica senza che io intervenissi nel codice. Cioè se su PC_1 e PC_2 lavorano contemporaneamente sulla stessa tabella, devo in qualche modo prevenire possibili errori/conflitti?
Con Sqlite non puoi Gestire il DB su più postazioni, io ti consiglio Mysql. A parere mio non è più difficile da usare che Sqlite, ti allego un esempio per creare e usare Mysql da gambas.
Citazione
3) Per i Report di Stampa credo che userò PDF-Writer (ma ancora devo leggere la documentazione relativa)
Ottima scelta, basta che ti scarichi gli esempi, è molto facile e veloce creare report con questa classe.
Citazione
3) E' possibile configurare dei profili utenti di gestione del software? Ossia il PC_1 (utenteA) può fare solo determinate operazioni mentre dal PC_2 (utenteB) se ne fanno altre (rendendo "unvisible" alcune voci del menù o alcuni pulsanti)? Vorrei inserire anche un profilo Admin (io) in grado di avere libero accesso a tutto il software... e che chiaramente può decidere "chi può usare cosa"...
L'idea è che ognuno abbia una propria password ed effettui il login all'avvio. Ed in base all'utente l'Admin decide di assegnargli un profilo (ad esempio l'utenteB (che lavora prettamente sul PC_2) potrebbe loggarsi ed usare anche il PC_1... e viceversa l'utenteA... ma sempre ed esclusivamente per le attività consentiti dal loro profilo...)
Puoi salvare ogni profilo in un file di testo, oppure anche in un db sqlite visto che sarà unico per ogni macchina e non condiviso. Puoi impostare se un utente può o no aprire certi form, basta impostare delle regole. Inoltre il per ogni utente che si collega a Mysql deve avere un nome utente e password, anche con permessi diversi.
Ma meglio che fai un passo alla volta ;)

P.s l'esempio te lo mando stasera adesso quà non c'è l'ho :D
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 12 Ottobre 2010, 14:28:04
Grazie mille! :ok:

Dovrò risolvere anche alcuni problemini legati a MySQL... tempo l'ho installato (mi pare con LAMPP) ma poi ho fatto un gran casino ed ora non ritrovo più le password...  :-[

Una curiosità, ma MySQL ad uso commerciale (cioè nel mio ufficio) non è a pagamento?
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 12 Ottobre 2010, 15:57:33
Intanto ho disinstallato il pacchetto MySQL-server e reinstallato, con il login e la password...

...ed ho testato il funzionamento del file Rubrica, scaricato nella sezione Download-->Guide&Tutorial-->Guida MySQL e Gambas, e mi gira! :)
Ho creato il DB Rubrica da shell e le tabelle, come descritto nella guida.

Finora non mi è sembrato così complicato, ma sono sicuro che a breve finirò così...  :hatecomputer:  ;D
Titolo: Re: Gestionale Perseo
Inserito da: md9327 - 12 Ottobre 2010, 17:24:05
A livello commerciale MySQL è a pagamento! Dipende dall'uso che ne fai. Nel tuo caso, leggi bene le clausole, perchè tu stai creando un'applicazione per l'uso in azienda, non lo vendi...

Se hai problemi, anche se la configurazione potrebbe anche risultare forse un pò più complessa (per giusta causa), puoi usare PostgreSQL, e qui non hai problemi di licenze...

Come anche sugggerito in altre risposte, io escluderei a priori SQLite, perchè oltre ad non essere multiuser, ha anche altri grandissimi limiti, tra cui le dimensioni dei dati (forse non è il tuo caso, ma meglio evitare). Inoltre è troppo semplice, e in futuro, quando avrai modo di conoscerlo, ti accorgerai che è tutt'altro che sicuro.
In sintesi: MySQL è teoricamente più veloce di PostgreSQL (il che dipende dall'assenza di molte caratteristiche presenti invece in PostgreSQL), ma sicuramente PostgreSQL offre una gestione professionale dei dati (simile o al pari di Oracle), con un'alta propensione verso la sicurezza dei database.

Nonostante quando si legge e si sente in giro, l'installazione e l'uso di PostgreSQL non è complicata. L'unica cosa su cui è necessario, o almeno auspicabile, è avere un minimo di conoscenza sulle modalità di accesso, le protezioni dei dati, ecc. Questo sono cose che puoi anche imparare mano mano che usi PostgreSQL, sempre che tu non abbia a completare il progetto in tempi brevi.

Un'ultima cosa legata ai database: il mio consiglio è di installare il server db su una macchina dedicata, che non sia utilizzata come desktop da qualcuno. Questo aumenta enormemente le prestazioni e la velocità di risposta, oltre ad essere più sicuro.
Titolo: Re: Gestionale Perseo
Inserito da: milio - 12 Ottobre 2010, 17:35:15
Senza contare che adesso Oracle e' proprietario di MySql...  :bad:
Titolo: Re: Gestionale Perseo
Inserito da: fsurfing - 12 Ottobre 2010, 19:55:13
se scrivi un software opensource non hai alcun problema di licenze con mysql
Titolo: Re: Gestionale Perseo
Inserito da: Golia - 12 Ottobre 2010, 20:27:28
Ecco l'esempio mysql-gambas. Nel modulo modMain metti il tuo utente e password. Si crea il database e la tabella da solo, poi c'è il solito esempio della rubrica  :2birre:
Titolo: Re: Gestionale Perseo
Inserito da: dex - 12 Ottobre 2010, 23:35:15
ciao perseo
io avevo cominciato con sqlite per la sua portabilità, ma man mano che il flusso di dati aumentava mostrava tutte le sue debolezze, poi sono passato a mysql.
parti direttamente con mysql o postgress come ti hanno consigliato, sqlite va bene per gestire piccoli programmi tipo rubriche telefoniche o agende.
per gambas fai bene a partire dalla 3 anche se si dice in versione alpha funziona bene, io ho cominciato con gambas2 e ora non posso  passare alla 3 in quanto devo fare parecchie modifiche al mio progetto.
l'esempio che ti ha postato golia è ottimo per cominciare, parti da li e poi appena hai problemi chiedi.
Per pdfWriter non ti preoccupare è molto più semplice di come sembra, appena sarai pronto per il tuo primo report ti posteremo dei programmi di esempio.
per la tua richiesta sui profili, io nel mio progetto ho creato un form di accesso con inserimento del nome e password (ogni operatore ne ha uno) poi una volta entrato si apre il main e in un file (criptato) assegno i permessi di cio che possono o non possono fare con il programma, per alcuni utenti rendo alcune voci del menu invisibili, un solo utente (amministratore) ha accesso completo al programma.
Titolo: Re: Gestionale Perseo
Inserito da: md9327 - 13 Ottobre 2010, 10:43:00
Senza contare che adesso Oracle e' proprietario di MySql...  :bad:

Infatti, e la cosa non piace per nulla...

Teniamo presente che hanno già fatto dei passi negativi verso l'open-source, chiudendo i server di test a PostgreSQL.
Il fatto che MySQL sia nato sotto libera licenza non blocca il fatto che, un momento qualsiasi, Oracle affossi il progetto.

PostgreSQL è completamente libero, e oltre ad essere abbastanza al passo con i più blasonati rdbms commerciali, è manutenuto da un nutritissimo gruppo di persone, oltre agli utenti stessi. Inoltre, ha un alto grado di compatibilità con Oracle (provato sul campo), per cui si potrebbe considerare quasi intercambiabile (forse esagero, ma ci stà...).
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 13 Ottobre 2010, 15:33:01
Perfetto (una parola grossa  :D )
...ho seguito sia la guida Gambas&MySQL sia il progetto database (quello degli esempi di Gambas) e finora non ho incontrato grosse difficoltà... limitatamente alla connessione, creazione e immissione/modifica/eliminazione di tabelle e record.

PostgreSQL un pochino lo conosco perché me ne interessai quando ero orientato al Python per la creazione del suddetto gestionale... e ne parlano un gran bene.

Per il momento credo che rimarrò su MySQL, soprattutto perché non avendo grosse conoscenze di gestione di database (circoscritta a qualche nozione basilare e qualche funzione SQL) forse ci sono più guide, ma sicuramente non escludo la possibilità futura di migrare su PostgreSQL.

Ad esempio... riguardo ai DB ho una curiosità.

1) ipotizzando che nel mio database ci siano registrati 1'000 utenti, e che ognuno di questi richieda periodicamente delle prestazioni, per alleggerire il carico di dati e l'interrogazione degli stessi, come si fa ad archiviare i vecchi lavori (tranne gli ultimi eseguiti)?
Mi spiego meglio, Tizio viene da me per la decima volta... ma a me, per l'inserimento progressivo, servono solo l'ultimo o le ultime due prestazioni effettuate... come faccio a non far vedere al DB tutte le altre?

Cerco di esprimermi a parole mie... io vorrei "congelare" le vecchie richieste in modo che il DB rimanga più snello, però nel frattempo vorrei anche avere la possibilità di controllare tutto l'archivio.
a) devo creare un DB temporaneo di volta in volta che apro il programma (o a cadenze settimanali/mensili), contenente solo gli ultimi lavori richiesti da ogni Tizio?
b) c'è la possibilità di "congelare" dei record mantenendo sempre lo stesso DB?
c) altra strada...

Temo che la risposta esatta sarà la "c"...  :D

PS: scusate se posto queste domande probabilmente banali, ma sono ...very newbie.  :-[
Titolo: Re: Gestionale Perseo
Inserito da: md9327 - 13 Ottobre 2010, 16:53:34
Quello che chiedi è una forma di ingegnerizzazione del sistema che dipende da molti fattori, tra cui alcuni che hai elencato.

Sia MySQL che PostgreSQL possono gestire delle viste, ovvero selezionare in modo stabile solo alcune informazioni prese da altre tabelle (una o più nella setssa vista).
La quantià di dati che pensi di memorizzare sono un fattore preponderante, ma tieni conto che se parli di sole alcune migliaia di record, il problema manco si pone, a meno che il tutto non giri un un C64...  ;D
Tutti e due i motori gestiscono mole di dati dell'ordine dei terabyte, e solo in questo caso un'analisi sarebbe opportuna, riguardo ovviamente la base hardware.
Un'altro fattore fondamentale è la corretta distribuzione dei dati, un pò come il trattare con gli oggetti e le classi in un linguaggio. Creare un layout snello porta a una migliore gestione e a migliori performance.

La tua idea di caching dei dati può essere un'idea, ma poi la gestione potrebbe risultare un pò complessa. Puoi anche prevedere, anzi è auspicabile, delle stored-procedure (procedure che risiedono sul db stesso) che fanno tutto il lavoro ma, ovviamente presuppone un minimo di conoscenza di plsql (linguaggio script sql dedicato al db).

Inoltre, devi prima capire come dividere i vari strati del sistema: interfaccia, logica, archivio. Se integri tutto in un blocco, ovvero usi Gambas per fare tutto (db a parte), la cosa sarà alquanto complessa.
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 13 Ottobre 2010, 17:52:40
...a meno che il tutto non giri un un C64...  ;D

hahahaah  ;D

In effetti è successo qualche anno fa di avere dei PC un po' datati e quando il software doveva chiudere la giornata ci metteva anche 30-40 secondi per eseguire l'operazione...  :rolleyes:
Poi con l'upgrade dei PC il problema si è risolto, però mi sono sempre chiesto come velocizzare il tutto. Parlo di un DB Access, e non so se MySQL o PostgreSQL siano più veloci nelle operazioni.

Da quello che ho potuto capire dal tuo post la cosa è fattibile ma complica notevolmente il tutto, quindi diciamo che la mettiamo tra le opzioni di codice bianco...  :)
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 14 Ottobre 2010, 16:01:01
Intanto per prendere un po' di confidenza ho cominciato dalla bozza del form di accettazione clienti...

Inutile dire che già ho tante domande.

Ho riscritto il codice per il CodiceFiscale/TesseraSanitaria... Se v'interessa lo posso postare... Però non so quale sia la procedura.

Sicuramente non è un codice leggerissimo, ma magari proponendolo può essere d'aiuto sia agli altri (a chi serve) che a me, se mi date dei consigli su come migliorarlo.

Mancano i Codici per gli Stranieri, ma appena posso li aggiungo.

Per l'algoritmo ho semplicemente seguito un codice fatto da un utente per VB e l'ho riadattato per Gambas3 (alcune istruzioni non funzionavano). Ho verificato il tutto seguendo le regole ufficiali per la creazione dei Codici Fiscali.


Domande:
1) Vorrei trasferire il codice dell'algoritmo del CF su un modulo, ma non ho capito come si richiama poi le variabile di quel modulo...

2) A me piacerebbe far comparire un form apposito (tipo "frmComuni.show"), per guadagnare spazio, per l'inserimento del codice istat del comune di nascita. Ma ho dovuto fare marcia indietro perché non riesco ad attribuire il valore ad una variabile scelta sul form secondario "frmComuni" sull'altro "FMain". In VB mi ricordo bisognava dichiarare la variabile come Public, ma sono anni che non lo uso e non mi ricordo molto bene...

3) In futuro cambierò la listbox dei comuni con una Grid... collegata al DB... Ma perché nella ListBox le lettere accentate di alcuni Comuni me le sostituisce con dei simboli strani?

4) Quando attribuivo un .Caption ai Label all'interno della figura della TesseraSanitaria, se prima non gliene davo uno predefinito (ho usato il segno "-"), non mi inseriva i campi di testo (cioè i Label rimanevano vuoti)...  :o

5) Non riesco a modificare il formato della data di nascita... Inizialmente avevo usato una textbox, ma mi faceva inserire la data con il formato "mm/gg/aa" (o aaaa). Io vorrei inserirla nel formato "gg/mm/aa" (o aaaa), ma non ci riesco. Stranamente quando inserisco una data me la inserisce con questo formato automatico "mm/gg/aaaa". Dove posso trovare materiale per la gestione delle date?
5b) si possono stabilire come regole delle maschere di formato (cioè 00/00/0000) con gli / fissi in cui si digitano solo i numeri, di continuo?

6) Una cosa molto importante:
Io sto valutando il programma sulla risoluzione del mio PC, che è 1920x1200... Però il programma girerà su PC con schermi a 17'', quindi minore della mia. C'è la possibilità di adattare la GUI grafica mantenendo le stesse proporzioni su tutti i computer su cui girerà il pacchetto? oppure mi conviene scegliere la risoluzione minore ed impostare le dimensioni della GUI su quella del 17'' (in questo caso credo che su PC con risoluzione più elevata si dovrebbe vedere più piccolo, e con degli spazi vuoti ...il che non sarebbe molto carino)?

Non vorrei lagnarvi, ma fatico a trovare materiale e guide. Intanto mi arrangio come posso, ma essendo in definitiva le stesse operazioni che dovrò fare su tutto il Database Gestionale, ci tengo a farmi subito chiarezza.

:)

PS: allego l'eseguibile...
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 14 Ottobre 2010, 16:25:40
Ho visto che comprimendo il progetto dovrebbe raggiungere una dimensione accettabile... Quindi ve lo allego completo.  :)

Ecco il link del codice VB originale da cui sono partito:
http://groups.google.com/group/microsoft.public.it.dotnet.vb/browse_thread/thread/97ad4866ce5f3225/8058171736b56e65 (http://groups.google.com/group/microsoft.public.it.dotnet.vb/browse_thread/thread/97ad4866ce5f3225/8058171736b56e65)
Titolo: Re: Gestionale Perseo
Inserito da: Ceskho - 14 Ottobre 2010, 18:34:47
Il mio consiglio è questo:

posta una richiesta alla volta creando appositi topic. In questo modo faciliterai il lavoro di noi che ti aiutiamo, eviti che più persone rispondano a cose diverse accavallando i messaggi in maniera contorta e disordinata e dai un titolo alle richieste per aiutare chi cercherà eventuali soluzioni a a problemi simili al tuo...

Ora continuiamo qui ma la prossima volta segui questa linea guida....

Il codice devi allegarlo al post e chiedere ad un moderatore che te lo carichi in area download...scrivi nel messaggio una breve descrizione del codice così appena pronto te lo alleghiamo...

1) crei un modulo e ci scrivi debntro la funzione dichiarandola publica. Se ad esempio il modulo si chiama MFiscale e la funzione CreaCodice allora la potrai richiamare con

Codice: gambas [Seleziona]
MFiscale.CreaCodice


Il mio consiglio e di fare in modo che la funzione accetti i vari parametri (Nome, cognome, data, etc...) e restituisca una stringa (il codice fiscale in pratica) così, se ad esempio vuoi far appparire lo stesso in una textbox dai:

Codice: gambas [Seleziona]
textbox1.text = MFiscale.CreaCodice("Pippo", "Dei pippis", "10/02/85", ...)


2) Questo argomento è stato ampiamente trattato cerca bene tipo: "Come passare variabili tra form"

3) Delle lettere accentate si è già discusso. Cerca il topic...se non lo trovi ne discutiamo meglio in seguito

4) Questo è del tutto normale. Se tu crei un label e dall'ide gli togli il testo interno (solitamente del tipo labelX) allora esso sarà vuoto e dovrai impostarlo tu. Non ci vedo nulla di strano. Anche gli altri oggetti si comportano così.

5) Ti consiglio di guardare la funzione Format o, come feci io tempo fa, ti scrivi una funzione che ti "sistema l'ordine" come vuoi tu

6) Quello che vuoi fare tu è sia semplice che difficile. Semplice poichè puoi usare oggetti come VBox, HBox, panel e le proprietà Expand degli oggetti per fare in modo che tutto venga ridimensionato con il form, difficile perchè per molti oggetti devi lavorare un pochetto....
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 14 Ottobre 2010, 19:12:25
Scusa Ceskho, ma perché dovrei postare un argomento alla volta quando ci sei tu che mi rispondi a tutto in 3secondi?!  ;D

Sei eccezionale! Grazie. :)

Il problema è che ho tanti dubbi per la testa... ed ho paura di cominciare nella maniera sbagliata, e poi buttare tutto il lavoro fatto.
Però hai veramente ragione, troppe domande messe insieme così non sono vanno bene. La prossima volta ne posterò una per volta, cercando di trovare un ordine d'importanza.

Quindi parto da quella che al momento mi sembra più importante, la 6)

Il tuo consiglio è di creare su ogni form un contenitore (me li studierò) e poi di usare la proprietà Expand... Appena posso cercherò di documentarmi meglio.
Ma che vuol dire "difficile, perché per molti oggetti devi lavorare un pochetto..."?
Mi puoi fare un esempio di quali oggetti potrei trovare difficoltà, e perché?
Titolo: Re: Gestionale Perseo
Inserito da: Ceskho - 14 Ottobre 2010, 19:15:50
Scusa Ceskho, ma perché dovrei postare un argomento alla volta quando ci sei tu che mi rispondi a tutto in 3secondi?!  ;D

Sei eccezionale! Grazie. :)

Il problema è che ho tanti dubbi per la testa... ed ho paura di cominciare nella maniera sbagliata, e poi buttare tutto il lavoro fatto.
Però hai veramente ragione, troppe domande messe insieme così non sono vanno bene. La prossima volta ne posterò una per volta, cercando di trovare un ordine d'importanza.

Quindi parto da quella che al momento mi sembra più importante, la 6)

Il tuo consiglio è di creare su ogni form un contenitore (me li studierò) e poi di usare la proprietà Expand... Appena posso cercherò di documentarmi meglio.
Ma che vuol dire "difficile, perché per molti oggetti devi lavorare un pochetto..."?
Mi puoi fare un esempio di quali oggetti potrei trovare difficoltà, e perché?

Se il tuo form si riduce a una decina di componenti sistemati in maniera piuttosto ordinata la cosa è abbastanza facile. Ma se gli oggetti diventano di più e non sono sistemati "uno sotto l'altro" allora dvi ingegnarti un pò per capire quale contenitore usare, come usarlo, dove usarlo, ecc...

Nei miei ultimi software faccio uso di questi oggetti...magari scaricateli e dacci un'occhiata....
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 14 Ottobre 2010, 19:51:02
...magari scaricateli e dacci un'occhiata....

Intanto grazie del ...Pellegrino!  :rotfl:
Titolo: Re: Gestionale Perseo
Inserito da: Ceskho - 14 Ottobre 2010, 20:01:19
...magari scaricateli e dacci un'occhiata....

Intanto grazie del ...Pellegrino!  :rotfl:

Non l'ho capita... :'(
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 14 Ottobre 2010, 20:09:27
...quando mi hai detto di scaricare e vedere i tuoi progetti... sono andato sul tuo sito ed in Homepage c'è scritto "Benvenuto pellegrino!"

"Benvenuti Pellegrino!" è un modo scherzoso che un mio amico ha di salutare gli altri... Pellegrino non nel senso non di giramondo, ma di persona rinco che si è persa... Quindi mi ha fatto ripensare a questa cosa che mi ha fatto sorridere. ;)
Titolo: Re: Gestionale Perseo
Inserito da: Ceskho - 14 Ottobre 2010, 20:16:06
...quando mi hai detto di scaricare e vedere i tuoi progetti... sono andato sul tuo sito ed in Homepage c'è scritto "Benvenuto pellegrino!"

"Benvenuti Pellegrino!" è un modo scherzoso che un mio amico ha di salutare gli altri... Pellegrino non nel senso non di giramondo, ma di persona rinco che si è persa... Quindi mi ha fatto ripensare a questa cosa che mi ha fatto sorridere. ;)

Ah...ecco... ;)

Comunque ti consgilio di lasciar perdere il sito e guardare questi due (quelli fatti meglio..il che è tutto dire.. :rotfl:):
http://code.google.com/p/meganalotto/
http://code.google.com/p/ocvc/
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 15 Ottobre 2010, 11:17:30
Fantastico!!! Ceskho... sei un mito!  :)

In pratica ho scoperto oltre alle cose che ti avevo chiesto anche altre potenziali applicazioni.

Ad esempio non conoscevo il comando SHELL... E' meraviglioso!
Ho creato un pulsante che mi apre la Calcolatrice e, tramite il comando 'espeaker'... gli faccio dire l'operazione che sto eseguendo! Volendo potrei creare una serie di istruzioni vocali su un file.txt e richiamarle quando mi occorrono... Oppure far leggere risultati di operazioni... Questo potrebbe tornarmi molto utile, visto che spesso noi eseguiamo operazioni in piedi, e quindi il risultato potrebbe essere anche ascoltato lontano dalla scrivania.
Inoltre, tramite SHELL, potrei anche crearmi un pannello utility con i pulsanti di tutte le applicazioni installate che mi servono... Calcolatrice, Gedit, Fogli di lavoro, ecc. oppure posso salvare file, interrogare il sistema su qualsiasi cosa... Ho un collegamento diretto con il PC!

Tornando ai Containers... da quello che ho capito, un Container è un campo che, oltre a raggruppare oggetti, me li distribuisce in modo automatico. Se al suo interno tutti gli oggetti (tra cui può esserci uno o più Containers nidificati) ha expand impostato su true guadagnano lo spazio possibile, altrimenti rimangono fissi come erano stati impostati.
Quindi se ad esempio voglio due pulsanti sempre al centro di un pannello creo un HBox ed al suo interno metto: i due pulsanti al centro (impostando il loro 'expand' a false), e due 'panel' fittizzi ai lati (impostando il loro 'expand' su true). In questo modo i due pulsanti rimangono sempre della stessa dimensione, ma varia in maniera automatica la dimensione dei 'panel' ai lati...
Risultato: i due pulsanti sono sempre al centro quando allargo o ristringo il pannello, o quando è lo massimizzo.

Quindi con questa tecnica posso distribuire tutti gli oggetti come più mi piace: con HBox e VBox! Giusto?!

Mi pare che in OCVC non hai usato H/VPanel e H/VSplit? A che servono?
Titolo: Re: Gestionale Perseo
Inserito da: Ceskho - 15 Ottobre 2010, 15:14:08
Fantastico!!! Ceskho... sei un mito!  :)

In pratica ho scoperto oltre alle cose che ti avevo chiesto anche altre potenziali applicazioni.

Ad esempio non conoscevo il comando SHELL... E' meraviglioso!
Ho creato un pulsante che mi apre la Calcolatrice e, tramite il comando 'espeaker'... gli faccio dire l'operazione che sto eseguendo! Volendo potrei creare una serie di istruzioni vocali su un file.txt e richiamarle quando mi occorrono... Oppure far leggere risultati di operazioni... Questo potrebbe tornarmi molto utile, visto che spesso noi eseguiamo operazioni in piedi, e quindi il risultato potrebbe essere anche ascoltato lontano dalla scrivania.
Inoltre, tramite SHELL, potrei anche crearmi un pannello utility con i pulsanti di tutte le applicazioni installate che mi servono... Calcolatrice, Gedit, Fogli di lavoro, ecc. oppure posso salvare file, interrogare il sistema su qualsiasi cosa... Ho un collegamento diretto con il PC!

In area download c'è sempre un mio programma che si chiama Parlas. Sfrutta Espeak....se vuoi dai un'occhiata anche a quello.

Citazione
Tornando ai Containers... da quello che ho capito, un Container è un campo che, oltre a raggruppare oggetti, me li distribuisce in modo automatico. Se al suo interno tutti gli oggetti (tra cui può esserci uno o più Containers nidificati) ha expand impostato su true guadagnano lo spazio possibile, altrimenti rimangono fissi come erano stati impostati.

Perfetto. Ai capito appieno il loro uso. Un oggetto con Expand = TRUE adatta la sua dimensione al conteiner in cui è inserito. In questo modo, giocando con gli oggetti giusti, riesci a creare un form scalabile senza usare una sola riga di codice....forte, no?

Citazione
Quindi se ad esempio voglio due pulsanti sempre al centro di un pannello creo un HBox ed al suo interno metto: i due pulsanti al centro (impostando il loro 'expand' a false), e due 'panel' fittizzi ai lati (impostando il loro 'expand' su true). In questo modo i due pulsanti rimangono sempre della stessa dimensione, ma varia in maniera automatica la dimensione dei 'panel' ai lati...
Risultato: i due pulsanti sono sempre al centro quando allargo o ristringo il pannello, o quando è lo massimizzo.

Questo è il metodo che usao io...non so se sia il migliore ma è l'unico che mi venne in mente ed ora uso sempre questo poichè non mi ha mai dato problemi.... ;)

Citazione
Quindi con questa tecnica posso distribuire tutti gli oggetti come più mi piace: con HBox e VBox! Giusto?!

Giusto.... :)

Citazione
Mi pare che in OCVC non hai usato H/VPanel e H/VSplit? A che servono?

Hsplit e Vsplit sono degli oggetti che permettono di decidere le dimensione degli oggetti interni mediante la barra di trascinamento posta tra un oggetto e l'altro. Se guardi l'ide di Gambas puoi notare che puoi espandere la parte centrale semplicemente trascinando il suo limite destro o sinistro...quello è uno Vsplit. Se non mi sono spiegato dimmelo che mi spiego meglio.

Hpanel e Vpanel sono l'evoluzione di Hbox e Vbox solo che quando serve pone gli oggetti su più righe o più colonne. é difficile da spiegare ma fai prima a provare ad usarlo per rendere l'idea... ;)
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 15 Ottobre 2010, 18:20:09
Appena posso do un'occhiata anche a Parlas...
Non so se sei interessato o se lo conosci già ...ti segnalo anche Festival (come TTS). Il progetto italiano lo trovi a questo link: http://www2.pd.istc.cnr.it/TTS/It-FESTIVAL.htm (http://www2.pd.istc.cnr.it/TTS/It-FESTIVAL.htm)
La qualità di sintesi vocale mi sembra molto buona.

Tornando ai Containers:
Non avevo proprio fatto caso al fatto che in multi-selezione si possono disporre e distribuire gli oggetti all'interno di un contenitore con le icone di allineamento!  :ok:
Comunque smanettandoci un po' su mi sono reso conto che la prima operazione da fare è sul FORM, settando la proprietà ARRANGEMENT diversa da NONE... Quindi: HORIZ, VERTICAL, ROW, COLUMN, FILL.
Poi mi sono reso conto che lo stesso risultato di HBox o di VBox lo si può ottenere con PANEL, settando anche a questo contenitore la proprietà ARRANGEMENT.
Che cosa cambia tra usare PANEL e gli HBox o VBox?

Sempre in tema di Containers... Stavo pensando che i forms ed suoi oggetti dovrebbero comunque partite da una base di risoluzione minima. Quindi forse la soluzione migliore è quella di creare un layout di un form di minime dimensioni (tipo 800x600, un po' meno considerando anche le barre d'intestazione sul desktop) e poi gestire quelli che voglio ingrandire, nel caso ci sia più spazio...
Cioè ad esempio, dividendo un ipotetico form in due colonne, in quella di dx, con le textbox la lascio a larghezza fissa, mentre vario le dimensione di quella di sn, con il DataGrid... per vedere meglio tutti i campi di ogni record...

PS: intanto ho implementato il modulo CodiceFiscale nel progetto.  ;)
Titolo: Re: Gestionale Perseo
Inserito da: dex - 15 Ottobre 2010, 22:52:37
Ciao perseo
non ho capito bene cosa devi fare, se adattare alcuni controlli del form o adattare il form alle varie risoluzioni mantenendo le proporzioni dei controlli.
Tempo fa avevo l'esigenza di far adattare un form alle varie risoluzioni pero tutte le text e label dovevano mantenere le posizioni e le dimensioni in proporzione, allora feci varie prove e alla fine con poche righe di codice e sfruttando l'evento resize trovai la soluzione.
Ti posto il codice vedi se ti può essere utile.
Titolo: Re: Gestionale Perseo
Inserito da: Golia - 16 Ottobre 2010, 00:06:09
@ dex
Ho provato il tuo codice, molto interessante  :ok:
L'ho provato con G2, con G3 non funziona. Puoi aggiustarlo? ;D
Ciao  :2birre:

@Perseo
Ho visto che stai tastando il terreno, mi piacerebbe che provassi GridBox, è un componente fatto da milio.
Serve per creare una griglia per inserimento dati, facile da usare da parte dell'utente finale, in pratica ci si muove e si scrive come in un foglio di calcolo. Molto facile anche da creare, con poche righe di codice ti prepari una griglia collegata al database con funzioni già pronte come Salva, Nuovo, elimina etcc. Inoltre puoi creare delle colonne di tipo combobox e check o colonne con funzioni esempio colonna "totale". Di recente Milio ha aggiunto la funzione Search, per cercare e inserire dati da un listino. Io l'ho usato per il mio gestionale che ho fatto con G2 e non ne farei a meno. Le ultime modifiche sono state fatte solo per G3, il progetto per G2 è stato abbandonato.
Se vuoi provarlo sono a tua disposizione molto volentieri, penso che si sia capito che è un progetto che mi stà a cuore  ;D
Ciao  :2birre: :2birre:
Titolo: Re: Gestionale Perseo
Inserito da: Ceskho - 16 Ottobre 2010, 00:37:27
Dunque, il problema risoluzione non esiste...è tutto frutto della tua immaginazione (  :rotfl: ) e ti spiego perchè..

Nel momento in cui setti tutti i parametri del form e degli oggetti coi rispettivi contenitori, vedrai che ad ogni ridimensionamento del form essi si adatteranno. Bene. Fin qui tutto ok.

Forse non avrai mai notato che richiamando l'evento FromQualsiasi.Show, gambas disegna il form richiamato e lo ridimensiona alle misure impostate o da codice o da IDE. Quindi il ridimensionamento dell'oggetto form viene richiamato almeno una volta da quando il form viene richiamato.

Fatti furbo: nelle impostazioni del form inserisci

Maximized = TRUE

in modo che il form, all'apertura, prenda le dimensioni dello schermo....in questo modo non dovrai preoccuparti di una dimensione risolutiva minima e avrai il form bello e sistemato.
Titolo: Re: Gestionale Perseo
Inserito da: dex - 16 Ottobre 2010, 01:03:26
Ceskho
ma a chi hai risposto?   :(
Titolo: Re: Gestionale Perseo
Inserito da: Ceskho - 16 Ottobre 2010, 01:11:24
Ceskho
ma a chi hai risposto?   :(

Perdonami, volevo rivolgermi a perseo.... ;)
Titolo: Re: Gestionale Perseo
Inserito da: dex - 16 Ottobre 2010, 01:44:18
per Golia
corretto per Gambas 3
Tieni presente che il codice agisce su tutti i controlli che metti nel form.
se vuoi che alcuni controlli non siano modificati dobbiamo cambiare il codice.
Titolo: Re: Gestionale Perseo
Inserito da: Golia - 16 Ottobre 2010, 10:08:08
Grazie mille, intanto và benissimo così.  :2birre:
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 16 Ottobre 2010, 12:26:49
@ dex:
all'inizio ero interessato ad una cosa proprio simile a quella che hai realizzato tu. Assomiglia ad un'applicazione in flash! Ti ringrazio tantissimo dex, ma quando Ceskho mi ha fatto capire l'utilità dei containers credo che mi orienterò su quella tecnica... Però la tua soluzione è molto interessante! ;)

@ Golia:
ho già scaricato e provato il GridBox (su Gambas3) e funziona meravigliosamente! La possibilità di editare record direttamente da griglia, a mò di foglio di calcolo, è meravigliosa. Poi la possibilità di combobox, ecc... e se implementerete anche il campo search... in pratica, a parte il caffè, fa tutto lui! ;D

@ Ceskho:
non volermi male, non lo faccio a posta. Cerco di riportare ciò che ho capito (e non-capito) e che mi passa per la testa, e non mi rendo conto se scrivo in maniera ripetitiva alcuni concetti sbagliati. :-[
Quando parlavo di "risoluzione minima" intendevo dire che se voglio fare dei form dividendone il contenuto in 2 o 3 colonne, di cui la prima a larghezza fissa, mentre le altre due a larghezza variabile (quelle con i datagrid), devo considerare che quella a la larghezza fissa lasci alle altre due (che si adattano allo spazio rimanente) uno spazio sufficiente per la lettura. Cioè, è inutile che su una risoluzione di 800x... metto la prima colonna a larghezza fissa 500, e poi ne rimangono 300 per le altre due, che seppure vi ci si adattano, si distribuiscono 150 cadauna.
Quindi se voglio un layout così credo di dover studiare una "risoluzione minima" che mi consenta di usare una colonna fissa che lasci uno spazio adeguato alle colonne espandibili.

Comunque sul layout mi avete già dato un'ottima infarinata ed una base da cui partire, e soprattutto da studiare ed approfondire (magari mi vedo bene anche gli altri esempi). Appena avrò le idee più chiare e sviluppo qualche esempio ve lo posto.  :)

Ora vi faccio un'altra domanda, sulle variabili:
Stavo pensando che vorrei abbandonare la spartana programmazione dell'uso delle variabili (ad esempio di quelle globali). Quindi vorrei dedicarmi alla creazioni di classi personalizzate (credo si dica così..) in sostituzione delle variabili.
Tornando all'esempio del codice fiscale, potrei crearmi la classe "persona" e definire le proprietà "cognome" [As String], "nome" [As String], "datadinascita" [As Date], ecc... in modo da richiamare ogni volta direttamente la classe persona con la sua proprietà persona.cognome = "....", persona.nome = "....", persona.datadinascita = "...", ecc...

La cosa mi tornerebbe utilissima visto che nel gestionale a volte ci sono tanti form e tante variabili... e:
1) mi posso dimenticare il nome della variabile o peggio ancora confondere con altre... e quindi commettere degli errori
2) potrei passare delle restrizioni alle variabili, nel senso di controlli... persona.età "deve essere solo numerica", deve essere "max 3 caratteri", deve essere "upper", ecc... e non dovrei eseguire operazioni ridondanti...
3) potrei creare delle funzioni della classe (si chiamano metodi?), tipo il calcolo del codice fiscale...
4) potrei velocizzare in fase di controllo... ad esempio creando una funzione ciclica che mi azzeri tutte le variabili che voglio, oppure che mi faccia un ciclo per dirmi quali sono quelle che mancano, ecc... [Queste operazioni di controllo le posso già fare anche con le variabili "normali", creando delle funzioni (tipo quella che calcola il codice fiscale passandogli le variabili), ma in questo modo credo che sarebbe più ordinato...]

Sicuramente di motivi validi ce ne sono tanti altri, che ignoro o che al momento non mi vengono in mente... ma già questi sono più che sufficienti!  ;D

Intanto faccio qualche ricerca, ma se intanto voleste indirizzarmi ve ne sarei grato.  :)

Edit: ho trovato questo link, di linuxforce (che se ho capito bene è il nostro Andy60) http://andreabertini.wordpress.com/2008/03/24/una-classe-con-gambas2/ (http://andreabertini.wordpress.com/2008/03/24/una-classe-con-gambas2/)  :yeah:
Titolo: Re: Gestionale Perseo
Inserito da: Ceskho - 16 Ottobre 2010, 15:32:11
Ti rispondo in ordine.

Il problema risoluzione come lo intendi tu è facilmente risolvibile impostando la lunghezza della parte fissa come porzione proporzionale alle dimensioni del desktop. Ad esempio potresti fare in modo che la parte fissa sia sempre un terzo (1/3) delle dimensioni dello schermo così i restanti due terzi (2/3) li dedichi alle altre due porzioni....

Per il codice fiscale una classe è sicuramente sprecata poichè  per la creazione del codice fiscale si richiede la chiamata di una funzione che la crei una sola volta. Questo può esser fatto con i moduli. Puoi creare una funzione che accetta i diversi parametri e restituisce la scringa codice fiscale. Ad esempio in un modulo di nome MCodice, inserisci questo codice:

Codice: gambas [Seleziona]
PUBLIC FUNCTION CreaCodiceFiscale(Nome AS String, Cognome AS String, etc....) AS String

  DIM $codice AS String

  ...qui calcoli il tuo codice fiscale e lo inserisci in $codice
 
  RETURN $codice

END


Potrai così creare i tuoi codici fiscali semplicemente dando

Codice: gambas [Seleziona]
$StringaQualsiasi = MCodice.CreCodiceFiscale("Gino", "Geppetto", .......)


Capito?
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 16 Ottobre 2010, 21:31:36
Ceskho... il modulo con la funzione già l'avevo fatta quando me l'avevi consigliata in un precedente post.

La classe di esempio a cui mi riferivo è proprio simile a quella proposta nel tutorial da linuxforce: lì c'è una funzione che calcola l'età (differenza tra la data di oggi e quella di nascita).
Passando i dovuti argomenti (cognome, nome, ecc.) potrei creare la funzione del calcolo del codice fiscale (che l'ho già fatta, però usando variabili locali/globali) io vorrei passargli CPersona.cognome, CPersona.nome, CPersonaDatadiNascita, ecc.

La mia domanda è: per calcolare il codice fiscale ho bisogno di determinati dati: cognome, nome, datadinascita (gg, mm, aa), sesso e codiceistat.
Prima di richiamare la funzione "crea_codice_fiscale" è possibile sapere se i campi sono stati tutti specificati, attraverso un ciclo.
...e non passando uno per uno i vari:
IF CPersona.cognome = "" THEN RETURN
IF CPersona.nome = "" THEN RETURN
IF CPersona.sesso = "" THEN RETURN
IF CPersona.datadinascita = "" THEN RETURN
IF CPersona.codiceistat = "" THEN RETURN

Si potrebbe fare un controllo dei campi, ad esempio, con qualcosa del tipo...

FOR EACH valore_campo IN CPersona.[ogni_campo]
 IF valore_campo = "" then RETURN
NEXT

Perdonatemi se ho scritto delle eresie! Magari non ne capite il fine, ma sicuramente le stesse tecniche di controllo sui dati mi serviranno nel gestionale in tante altre occasioni, quindi se posso avvicinarmi ad un codice più snello per me sarebbe una grande soddisfazione.

 :)
Titolo: Re: Gestionale Perseo
Inserito da: Ceskho - 17 Ottobre 2010, 01:28:25
Il primo metodo che mi viene in mentre è creare un array di nome Persona[] di tipo stringa dove ogni indice equivale a qualcosa tipo nome, cognome, data di nascita, etc....

Poi con un ciclo for ti passi tutti gli indici e controlli che non siano vuoti

Codice: gambas [Seleziona]

DIM Persona AS String[3]
DIM i AS Integer

Persona[0] = "Pippo"
Persona[1] = "Pluto"
Persona[2] = "30/12/30"

FOR i = 0 TO Persona.Count - 1
    IF Persona[i] = "" THEN RETURN
NEXT
Titolo: Re: Gestionale Perseo
Inserito da: dex - 17 Ottobre 2010, 01:50:44
Edit per Golia

mi sono dimenticato di dirti che il codice che ho postato ridimensiona tutti i controlli del form tranne quelli presenti in altri controlli.
Per esempio hai un Panel, il codice ridimensiona il Panel ma non i controlli al suo interno.

Per ridimensionare tutti i controlli anche quelli nidificati cambia le due righe:
Codice: [Seleziona]
FOR EACH hControl IN ME.Children

con
Codice: [Seleziona]
FOR EACH hControl IN ME.Controls
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 17 Ottobre 2010, 09:51:19
Ceskho,
quello dell'array è un'ottima soluzione, ma sempre su variabile (locale/globale)

Io pensavo esistesse qualcosa di simile ad un metodo .item() della classe che ho creata, che mi restituisca ogni metodo o proprietà della mia classe CPersona, ed il relativo valore...

Se io alla mia classe CPersona ho assegnato:
- CPersona.cognome,
- CPersona.nome,
- CPersona.datanascita, ecc...
non esiste un'istruzione che mi restituisca ogni metodo della classe, tipo: CPersona.items() --> "cognome", "nome", "datanascita"...

 :-\

Scusa se insisto, ma vorrei trovare una soluzione sfruttando le classi.  :)
Titolo: Re: Gestionale Perseo
Inserito da: andy60 - 17 Ottobre 2010, 10:03:25
@perseo

prova, prova, prova, vedrai che ci si arriva, cmq vedo se riesco a darti una mano, ma non garantisco sui tempi, ne ho gia' ristretti x i miei di lavori
 :2birre:
Titolo: Re: Gestionale Perseo
Inserito da: Ceskho - 17 Ottobre 2010, 13:42:20
Ceskho,
quello dell'array è un'ottima soluzione, ma sempre su variabile (locale/globale)

Io pensavo esistesse qualcosa di simile ad un metodo .item() della classe che ho creata, che mi restituisca ogni metodo o proprietà della mia classe CPersona, ed il relativo valore...

Se io alla mia classe CPersona ho assegnato:
- CPersona.cognome,
- CPersona.nome,
- CPersona.datanascita, ecc...
non esiste un'istruzione che mi restituisca ogni metodo della classe, tipo: CPersona.items() --> "cognome", "nome", "datanascita"...

 :-\

Scusa se insisto, ma vorrei trovare una soluzione sfruttando le classi.  :)

Se ho capito bene l'unico metodo è quello delle variabili globali....oppure crei delle variabili private e poi te le fai restituire da una funzione tipo:

Codice: gambas [Seleziona]
PRIVATE $Cognome AS String

PUBLIC FUNCTION GetCognome() AS String
   RETURN Cognome
END


ed ottieni il cognome, ad esempio, con:

Codice: gambas [Seleziona]
PRINT Modulo.GetCognome()


Oppure in alternativa:

Codice: gambas [Seleziona]
PRIVATE nome, cognome, datanascita AS String

PUBLIC FUNCTION GetData(Data AS String) AS String
   IF data = "Nome" THEN
      RETURN Nome
   ELSE IF data = "Cognome" THEN
      RETURN Cognome
   ELSE IF data = "Data" THEN
      RETURN datanascita
   END IF
END


e poi richiamai, ad esempio il cognome con

Codice: gambas [Seleziona]
PRINT Modulo.GetData("Cognome")


Ovviamente puoi usare SELECT CASE ma era giusto per rendere l'idea....
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 19 Ottobre 2010, 10:26:38
Scusate, sono stato fuori tutto il WeekEnd e non ho potuto rispondere...

Peccato Ceskho... avrei preferito nettamente l'utilizzo delle classi. Però anch'io ho cercato in giro e non sono riuscito a trovare niente.

Quello che mi sono chiesto è questo:
Come mai nell'Ide di Gambas, quando creo una mia classe (CPersona), il completamento automatico, appena metto il punto (CPersona.) mi chiede le opzioni .cognome, .nome, ecc...?
Così ho pensato che il completamento automatico di Gambas funzioni con qualche metodo che rielenca tutte le proprietà di una classe, ecc...
E se esisteva questo comando, potevo sfruttarlo anch'io per il mio codice di controllo sulla classe CPersona.

Comunque non mi do per vinto e continuerò a cercare...  :hard:
Titolo: Re: Gestionale Perseo
Inserito da: milio - 19 Ottobre 2010, 14:20:36
Non ho letto tutto il post  :-[ ma se ho capito tu vorresti fare una classe CPersona con le proprietà Cognome, Nome, DataNascita ?

Bhe allora il modo corretto di creare delle proprietà e' questo:

Codice: vb.net [Seleziona]
' Gambas class file

Property Cognome As String
Private $Cognome As String

Property Nome As String
Private $Nome As String

Property DataNascita As Date
Private $DataNascita As Date

Private Function Cognome_Read() As String
  Return $Cognome
End
Private Sub Cognome_Write(Value As String)
  $Cognome = Value
End

Private Function Nome_Read() As String
  Return $Nome
End
Private Sub Nome_Write(Value As String)
  $Nome = Value
End

Private Function DataNascita_Read() As Date
  Return $DataNascita
End
Private Sub DataNascita_Write(Value As Date)
  $DataNascita = Value
End


Cosi' facendo quando dai: Persona.Cognome = "Rossi"
non fai altro che invocare la sub Cognome_Write
mentre con variabile = Persona.Cognome invochi Cognome_Read

Cosi' facendo puoi anche intercettare il momento in cui vai a settare o richiamare una determinata proprietà della classe Persona....
Titolo: Re: Gestionale Perseo
Inserito da: dex - 19 Ottobre 2010, 14:59:33
milio sei il re delle classi

devo farti una richiesta e non so se vado off topic (nel caso mi prendo una ramanzina da ceskho  :'()

il codice che ho postato per golia lo uso su vari form per farli adattare alle varie risoluzioni, solo che lo inserisco in ogni form, si può creare una classe?
Titolo: Re: Gestionale Perseo
Inserito da: Ceskho - 19 Ottobre 2010, 15:07:36
milio sei il re delle classi

devo farti una richiesta e non so se vado off topic (nel caso mi prendo una ramanzina da ceskho  :'()

il codice che ho postato per golia lo uso su vari form per farli adattare alle varie risoluzioni, solo che lo inserisco in ogni form, si può creare una classe?

Sei offtopic....veramente tutto il topic sta andando fuori dai binari iniziali...su su su ragazzi...in riga....
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 19 Ottobre 2010, 15:11:50
Grazie Millo,

quella di CPersona è un esempio di una delle classi che vorrei costruire.

In sostanza vorrei, attraverso un ciclo (tipo FOR EACH... IN CPersona) sapere se ogni campo è stato dichiarato.

Ti simulo un processo logico:
Nel form vengono inserite delle Textbox per specificare alcuni campi (per definire stringhe, boolean e date) della classe CPersona. Ogni TextBox si riferisce ad una proprietà di della classe CPersona. Quindi avrò la txtCognome per CPersona.cognome, txtNome per CPersona.nome, btnSesso per CPersona.sesso, txtDatadiNascita per Cpersona.datadinascita.

Quando richiamo la funzione Calcola_Codice_Fiscale... se ci fosse una proprietà di CPersona non specificata, la funzione mi restituisce errore. quindi la mia domanda è: esiste un modo per controllare che tutte le proprietà di CPersona siano state dichiarate?

Vorrei evitare di fare questo controllo sia sui Controlli TextBox, sia tramite IF CPersona.[proprietà] = "" THEN..., perché questo tipo di controllo dovrò farlo su tanti altri form di immissione dati. Quindi per ognuno dovrei scrivere dei controlli personalizzati.
Invece mi chiedevo se c'era un metodo generico, in cui specificando solo il nome della classe, la funzione mi esegua il controllo su tutte le sue proprietà (senza sapere quali e quante siano).
In pratica questa soluzione, se possibile, credo che mi risolverebbe un casino di tempo e renderebbe il codice molto più snello.
Titolo: Re: Gestionale Perseo
Inserito da: milio - 19 Ottobre 2010, 17:51:04
Bhe sicuramente il codice fiscale puoi inserirlo come una proprietà della classe CPersona:

Codice: vb.net [Seleziona]
Property Read CodiceFiscale as String

Private Function CodiceFiscale_Read() As String

  ...
   ' Codice di calcolo codice fiscale

   ' se uno o piu' elementi che compongono il codice fiscale non sono dichiarati dai un bel Return ""
   ' altrimenti ritorni il codice fiscale calcolato

End


La proprietà rimane in sola lettura e soltanto quando le varie proprietà da te scelte sono settate, restituisce il codice... Naturalmente il 'vedere' se ogni proprietà e' settata e' una procedura che metterai all'interno della classe stessa, in modo da essere sempre disponibile in qualsiasi punto del tuo programma che richiama il codice fiscale della classe...

Se vuoi mi scarico il tuo programmino che hai postato la volta scorsa e ti faccio una bozza di classe, cosi' almeno ci capiamo meglio ;)


@ dex

ci do un'occhiata e ti dico (naturalmente in un altro post, appena l'avrai aperto ;) )
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 19 Ottobre 2010, 19:43:21
Certo Millo,

se vuoi dargli un'occhiata ne sarei felice.

Intanto, come suggeritomi anche da Ceskho, ho abbozzato un modulo per il calcolo del codice fiscale... ed ho aggiunto la soluzione "form_resize" consigliata da dex. Te lo allego qui.

 :)
Titolo: Re: Gestionale Perseo
Inserito da: milio - 19 Ottobre 2010, 22:44:31
eccoti un esempio di classe Persona con evento su calcolo di codice fiscale....

e' sicuramente migliorabile  :-[ ,  se hai dubbi chiedi pure :)
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 20 Ottobre 2010, 11:01:51
Millo, non ho parole!
Riscrivendomi il codice mi hai dato tanti spunti che ignoravo.

Le cose che mi sembra di aver capito sono che:
1) Le proprietà della classe che vengono create hanno dei metodi _read() e _write() che vengono invocati quando si legge o si scrive una di queste proprietà della classe. Quindi sono ottimi quando si vuol fare un controllo oppure quando si vuol tentare il calcolo di una funzione, ecc.
La proprietà CodiceFiscale è l'unica di sola lettura... perché giustamente deve essere calcolata (e non inserita a mano).

2) La funzione CalcoloCodiceFiscale() restituisce un booleano... quindi se tutti i termini sono stati specificati, calcola il $CodiceFiscale e restituisce un TRUE, altrimenti se ci sono errori restituisce FALSE ed invoca la funzione NoCodice() --> questa attribuisce "" a $CodiceFiscale e... (qui ho un grosso dubbio) con RAISE (http://gambasdoc.org/help/lang/raise?it) richiama CalculateCode della FMain?

3) La funzione CalculateCode della FMain attribuisce $CodiceFiscale (ossia Persona.CodiceFiscale) alla txtCodiceFiscale... e se Persona.CodiceFiscale è vera (ossia diversa da "" ???) allora inserisce i .Caption alle Label della tessera sanitaria.

4) Ogni volta che viene editata una proprietà in scrittura (cognome, nome, datanascita, ecc.), se il CalcoloCodiceFiscale() è TRUE, allora invoca CalculateCode della FMain... e si torna al punto 3).

5) Chiaramente quando viene chiesto se CalcoloCodiceFiscale è TRUE o FALSE implicitmente viene fatto eseguire... quindi assegnerebbe $CodiceFiscale se fosse TRUE...

Questo è quello che sono riuscito a capire, e spero sia corretto.  :-[

Ho anche una grossa lacuna quando nella FMain dichiari:
Codice: [Seleziona]
Private Persona As CPers
...che vuol dire che l'istanzi con...
Codice: [Seleziona]
Persona = NEW CPers As "Persona"
???

PS: vedi la parte di codice quando comincia la funzione CalcoloCodiceFiscale()...
Codice: [Seleziona]
  If $Cognome = "" Then Return NoCodice()
  If $Nome = "" Then Return NoCodice()
  If IsNull($DataNascita) Then Return NoCodice()
  If $CodiceIstat = "" Then Return NoCodice()
  If $Sesso = "" Then Return NoCodice()

Io mi chiedevo se esiste una funzione che esegua il controllo tipo:
FOR EACH proprietà IN CPers
  IF proprietà = "" then Return NoCodice()
NEXT

Se i campi da controllare fossero tanti sarebbe un buona alternativa a tutti gli IF...
Titolo: Re: Gestionale Perseo
Inserito da: milio - 20 Ottobre 2010, 13:49:40
1)  :ok:

2) il comando Raise scatena l'evento dichiarato con l'istruzione Event, all'interno della classe contenitore (in questo caso in FMain)

3)  :ok:

4) No, in questo caso l'Evento CalculateCode viene comunque scatenate anche se il CodiceFiscale non puo' essere calcolato. In pratica l'evento mi serve solamente per tener aggiornato la textbox che contiene il codice. Se il calcolo del codice genera errore, la textbox assumerà  un valore nullo. Questo e' un punto che volendo si puo' anche riscrivere, facendo in modo che l'evento si scateni una sola volta se il calcolo del codice e' errato; allo stato attuale l'evento viene scatenato ogni qualvolta ci sia un aggiornamento nelle proprietà della classe

5) vedi punto 4 :)

Citazione
Ho anche una grossa lacuna quando nella FMain dichiari:
Codice:
Private Persona As CPers
...che vuol dire che l'istanzi con...
Codice:
Persona = NEW CPers As "Persona"
Quando scrivo:

Private Persona As CPers

dichiaro che la variabile Persona e' di tipo CPers, ma l'oggetto vero e proprio ancora non esiste in memoria.

Persona = NEW CPers As "Persona"

qui invece istanzio l'oggetto in memoria, quindi creo 'fisicamente' l'oggetto Persona e gli assegno una 'etichetta' dopo l'istruzione As che identifica nella classe contenitore i vari eventi dell'oggetto creato.
Diciamo che Persona puo' essere tante Persone, ma alla fine le caratteristiche sono sempre quelle della classe CPers
Quindi io posso anche avere:

Persona1 = NEW CPers As "Persona1"
Persona2 = NEW CPers As "Persona2"
Persona3 = NEW CPers As "Persona3"
Persona4 = NEW CPers As "Persona4"


ogni persona a nome, cognome .... e codice fiscale diversi, ma proprietà, metodi ed eventi uguali...

Citazione
PS: vedi la parte di codice quando comincia la funzione CalcoloCodiceFiscale()...
Codice:
 If $Cognome = "" Then Return NoCodice()
  If $Nome = "" Then Return NoCodice()
  If IsNull($DataNascita) Then Return NoCodice()
  If $CodiceIstat = "" Then Return NoCodice()
  If $Sesso = "" Then Return NoCodice()

Io mi chiedevo se esiste una funzione che esegua il controllo tipo:
FOR EACH proprietà IN CPers
  IF proprietà = "" then Return NoCodice()
NEXT

Se i campi da controllare fossero tanti sarebbe un buona alternativa a tutti gli IF...

Sinceramente non mi sono mai posto il problema, anche perche' il codice di controllo lo scrivi solamente una volta...
Con l'oggetto Class, dandogli come riferimento la classe CPers, puoi richiedere quali siano le sue proprietà, metodi ed eventi e con Object.GetProperty fai il controllo in questione es.:

Codice: vb.net [Seleziona]
Dim x As Class
Dim Txt As String

  x = Object.Class(Me)

  For Each txt In x.Symbols
    If x[txt].Kind = x.Property Then
      If IsString(x[txt].Value) Then Print Object.GetProperty(Me, txt)
    End If
  Next


Il codice e' sotto inteso che sia scritto nella classe CPers.


Ps.
Per spiegare certe cose non sono tanto bravo, non ho studiato informatica e uso un linguaggio terra terra, diciamo che certe cose le ho capite e altre le intuisco... per tutto il resto c'e' mastercard... :)

ti rimando anche a questo link per una spiegazione piu' esauriente ;) http://it.wikipedia.org/wiki/Oggetto_(informatica)
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 20 Ottobre 2010, 14:03:26
milio sei il re delle classi

Ora capisco perché!  :ok: :ok:

Ho sostituito il controllo della "sequenza degli IF" con questo codice (mettendo i commenti delle cose che penso di aver capito  :-[ ):
Codice: VB.net [Seleziona]
Dim x As Class 'x è un oggetto classe
Dim txt As String 'txt è una stringa

  x = Object.Class(Me) 'Object.Class(Me) che cos'è?

  For Each txt In x.Symbols 'x.Symbols che cos'è?
    If x[txt].Kind = x.Property Then 'x[txt].Kind restituisce in formato numerico il tipo: "2" è una proprietà, "4" è una funzione, "3" è riferita a _new, ecc...; mentre x.Property restituisce il tipo in formato numerico delle proprietà dell'oggetto x (sempre 2)... PS: potrei sostituire direttamente x.Property con "2", visto che a me interessano le proprietà, in scrittura?
      If x[txt].name <> "CodiceFiscale" Then 'x[txt].name credo restituisca il nome della proprietà della classe
        If IsNull(Object.GetProperty(Me, txt)) Then Return NoCodice() 'Object.GetProperty(Me, txt) restituisce il valore della proprietà...
      End If
    End If
  Next


Non ho ancora capito bene il funzionamento, però è proprio ciò che cercavo!!! Fantastico Milio!  :)
Ora dovrò studiarmelo bene, approfondendo i vari argomenti.
Titolo: Re: Gestionale Perseo
Inserito da: milio - 20 Ottobre 2010, 20:19:38
Object.Class(ME) e' un metodo dell'oggetto Object (Me si riferisce alla classe in cui stai scrivendo il codice e vale per qualsiasi classe) e vuol dire:

Dell'oggetto (me stesso) dimmi a che classe appartiene.

In questo caso restituisce la classe CPers

x.Symbol (sarebbe Class.Symbol) restituisce un oggetto String[] contenenti i nomi di tutte le proprietà, metodi ed eventi.


Per il discorso della costante Class.Property non fa una grinza il tuo ragionamento, ma quando rileggi il codice vien piu' facile riconoscerne il tipo.
Titolo: Re: Gestionale Perseo
Inserito da: perseo - 27 Ottobre 2010, 19:33:59
In questo periodo non ho tantissimo tempo da dedicare alla programmazione, però appena posso sto dando un'occhiata a GOSH, il gestionale per alberghi di fsurfing. E' un bel lavoro e trovo molti spunti interessanti: ad esempio l'organizzazione degli utenti e del LOG, oppure l'utilizzo della classe gb.settings (molto molto utile), ed altre cose che man mano vengono fuori...

Davvero un bel lavoro!  :ok:

Spero di cominciare presto a buttar giù qualcosa anch'io...  :)
Titolo: Re: Gestionale Perseo
Inserito da: fsurfing - 27 Ottobre 2010, 21:25:56
Citazione
n questo periodo non ho tantissimo tempo da dedicare alla programmazione, però appena posso sto dando un'occhiata a GOSH, il gestionale per alberghi di fsurfing. E' un bel lavoro e trovo molti spunti interessanti
sto gongolando!  :2birre: