Autore Topic: Gestionale Perseo  (Letto 7523 volte)

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #30 il: 16 Ottobre 2010, 01:03:26 »
Ceskho
ma a chi hai risposto?   :(

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Gestionale Perseo
« Risposta #31 il: 16 Ottobre 2010, 01:11:24 »
Ceskho
ma a chi hai risposto?   :(

Perdonami, volevo rivolgermi a perseo.... ;)

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #32 il: 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.

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #33 il: 16 Ottobre 2010, 10:08:08 »
Grazie mille, intanto và benissimo così.  :2birre:

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #34 il: 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/  :yeah:
« Ultima modifica: 16 Ottobre 2010, 13:48:02 da perseo »

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Gestionale Perseo
« Risposta #35 il: 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?

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #36 il: 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.

 :)
« Ultima modifica: 16 Ottobre 2010, 21:46:04 da perseo »

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Gestionale Perseo
« Risposta #37 il: 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

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #38 il: 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

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #39 il: 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.  :)

Offline andy60

  • Senatore Gambero
  • ******
  • Post: 1.255
    • Mostra profilo
    • https://www.linkedin.com/in/andbertini
Re: Gestionale Perseo
« Risposta #40 il: 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:

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Gestionale Perseo
« Risposta #41 il: 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....

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #42 il: 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:

Offline milio

  • Senatore Gambero
  • ******
  • Post: 1.273
  • Chi parla poco dice tanto...
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #43 il: 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....

Offline dex

  • Gran Maestro dei Gamberi
  • *****
  • Post: 872
    • Mostra profilo
Re: Gestionale Perseo
« Risposta #44 il: 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?