Grazie, hai fatto prestissimo!!.
Al primo avvio funziona ok e inserisco il nome. Poi non si apre più niente.., forse perchè fai chiudere il form principale? Comunque volevo chiederti come funziona file.load nel caso di più campi: es. nome, cognome, indirizzo?
Ho cambiato il tuo esempio così: ho messo Fmain come classe di avvio. Su fmain
PUBLIC SUB Form_Open()
IF NOT Exist(User.Home & "/.cartella_nascosta1") THEN
MKDIR (User.Home & "/.cartella_nascosta1")
FNome.Show
ELSE
Label1.text = file.load(user.home & "/.cartella_nascosta1/impostazioni.txt")
END IF
END
Su fnome:
PUBLIC SUB Button1_Click()
'controlliamo che la casella sia vuota
IF TextBox1.text = "" THEN
Message.Error("Inserire un nome!", "Ok")
ELSE
'se è piena salviamo la stringa nel file di testo delle configurazioni
file.save(User.Home & "/.cartella_nascosta1/impostazioni.txt", TextBox1.text)
ME.Close
FMain.Label1.text = file.load(user.home & "/.cartella_nascosta1/impostazioni.txt")
END IF
END
Non preoccuparti se non hai tanto tempo, io per primo ne ho pochissimo. Comunque ci conto tanto sul tuo aiuto, grazie :-)
Suggerimento: evita di spargere file a giro per la home, meglio lasciare tutti i dati all'interno della cartella dove risiede usando Application.Path invece di User.home.
Per gestire più righe un metodo semplice è questo:
DIM hFile AS File
DIM Dato1, Dato2 AS Text
'-- lettura
hFile = OPEN Application.Path & "/nome_del_file" FOR INPUT
LINE INPUT #hFile, Dato1
LINE INPUT #hFile, Dato2
CLOSE #hFile
'-- scrittura
hFile = OPEN Application.Path & "/nome_del_file" FOR CREATE
PRINT #hFile, Dato1
PRINT #hFile, Dato2
CLOSE #hFile
Ciao ragazzi, mi potreste aiutare a capire come funzionano le combobox che proprio non ne dò fuori..
Non riesco a popolare la combo con i valori della tabella, tutto quello che riesco a fare è questo: cmbcortesia.list = ["Egregio sig.", "pippo2", "pippo3", "pippo4"]. La mia tabella è "f_cortesia" il campo "formulacortesia". Questo proprio non va
MODMain.Connect()
MyRS = MODMain.$conn.Exec("select * from f_cortesia")
IF MyRS.Available = TRUE THEN
ComboBox1.list = MyRS!formulacortesia
ENDIF
Grazie
prova così:
MODMain.Connect()
MyRS = MODMain.$conn.Exec("select * from f_cortesia")
IF MyRS.Available = TRUE THEN
comboBox1.clear ''''''questo potrebbe non servire
for i=0 to Myrs.count-1
ComboBox1.add(MyRS!formulacortesia ,i)
next
ENDIF
se la combobox è definita come solo lettura puoimodificare così:
MODMain.Connect()
MyRS = MODMain.$conn.Exec("select * from f_cortesia")
IF MyRS.Available = TRUE THEN
comboBox1.readonly=false
comboBox1.clear ''''''questo potrebbe non servire
for i=0 to Myrs.count-1
ComboBox1.add(MyRS!formulacortesia ,i)
next
comboBox1.readonly=true
ENDIF
semplicemente ad inizio funzione devi dichiarare la variabile i che io ho utilizzato per tenere l' indice della combo , la puoi dichiarare con un
posizionato giusto dopo la dichiarazione di funzione della procedura che hai scritto tu .
esempio
Public funcion button1_click
dim i as integer
MODMain.Connect()
MyRS = MODMain.$conn.Exec("select * from f_cortesia")
IF MyRS.Available = TRUE THEN
comboBox1.clear ''''''questo potrebbe non servire
for i=0 to Myrs.count-1
ComboBox1.add(MyRS!formulacortesia ,i)
next
ENDIF
in alternativa dovrebbe funzionare anche così:
MODMain.Connect()
MyRS = MODMain.$conn.Exec("select * from f_cortesia")
IF MyRS.Available = TRUE THEN
comboBox1.clear ''''''questo potrebbe non servire
for EACH Myrs.count
ComboBox1.add(MyRS!formulacortesia)
next
ENDIF
vero modifica cosi:
MODMain.Connect()
MyRS = MODMain.$conn.Exec("select * from f_cortesia")
IF MyRS.Available = TRUE THEN
comboBox1.clear ''''''questo potrebbe non servire
myrs.movefirst '''''posiziona il result all' inizio
for i=0 to Myrs.count-1
ComboBox1.add(MyRS!formulacortesia ,i)
myMrs.movenext '''''muove l' indice del result al prossimo valore
next
ENDIF
Perfetto grazie mille!!
Ci sono deglie errori di scrittura per chi può interessare il codice
MODMain.Connect()
MyRS = MODMain.$conn.Exec("select * from f_cortesia")
IF MyRS.Available = TRUE THEN
comboBox1.clear ''''''questo potrebbe non servire
MyRS.movefirst '''''posiziona il result all' inizio
for i=0 to Myrs.count-1
ComboBox1.add(MyRS!formulacortesia ,i)
MyRS.movenext '''''muove l' indice del result al prossimo valore
next
ENDIF
Grazie mille
Nell'evento keypress di GridView devi inserire
IF (key.code = Key.up OR key.code = Key.down) THEN
STOP EVENT
ELSE
RETURN
END IF
In pratica IF isola i tasti up e down della tastiera
Ciao Ceskho grazie, satasera provo.
Un dubbio.. se ho capito bene così sono disattivati, io dovrei disattivarli per il loro normale funzionamento, però mi servono per spostarmi nei record. E' giusto fare così?
IF (key.code = Key.up) THEN
STOP EVENT
MIAFUNZIONEUP
ELSE
RETURN
ENDIF
Ciao grazie
Grazie Ceskho, funziona così
IF key.code = Key.Up THEN
FUNZIONE_UP
STOP EVENT
ENDIF
IF key.code = Key.Down THEN
FUNZIONE_DOWN
STOP EVENT
ENDIF
Grazie mille, tra pochi giorni posto la prima parte del progetto, Gambas è una figata
P.S. quando mi mandi l'email con le coordinate del tuo conto corrente? :-D
Ciao ragazzi, eccomi ancora..
Ho questo problema: (spero di spiegarmi bene perchè ormai ho il cervello in tilt :-? )
Devo aggiornare dei record filtrati:
Ho dei record (dettagli) che appartegono a un preventivo, (possono essere 2,3,4,100). Io dovrei aggiornare tutti i dettagli solo di questo preventivo.
Il cambiamento che devo fare è questo: sul primo dettaglio ho scritto un nome fornitore, dovrei scriverlo su tutti, in patica tutti uguali al primo.
Spero di essermi spiegato. ho provato a fare questo codice..non dovrei neanche mostrarlo
PUBLIC SUB sostelementi()
DIM i2 AS Integer
DIM sql AS String
DIM mystriga AS String
DIM myid AS String
sql = "select * from dettagli WHERE idpreventivo LIKE '%" & tbidpreventivo.Text & "%'" " "
sql = sql & "order by iddettaglio"
MODMain.Connect()
MyRS = MODMain.$conn.Exec(sql)
IF MyRS.Available = TRUE THEN
MyRS.movefirst
mystriga = MyRS!fornitore
FOR i2 = 0 TO Myrs.count - 1
myid = MyRS!iddettaglio
aggiornacampo(myid, mystriga)
MyRS.movenext
NEXT
ENDIF
END
PUBLIC SUB aggiornacampo(lamiastringa AS String, miocampo AS String) AS String
MODMain.Connect()
MyRS = MODMain.$conn.Edit("dettagli", "iddettaglio=" & lamiastringa)
MyRS!fornitore = miocampo
MyRS.Update
MODMain.$conn.Commit
MODMain.$conn.Close
END
Grazie
Dopo ripetute botte in testa ho fatto questo:
PUBLIC MyRS AS Result
........
MODMain.Connect()
MyRS = MODMain.$conn.EXEC("UPDATE dettagli SET fornitore=&1", tbfornitore.text, )
e funziona, solo che mi cambia tutti i fornitore, ho bisogno di filtrare solo i dettagli di un preventivo, questa è la condizione:
DIM sql AS String
sql = "WHERE idpreventivo LIKE '%" & tbidpreventivo.Text & "%'" ""
Solo che non riesco a mettere insieme il tutto
Finalmente ce l'ho fatta :-?
sql = "UPDATE dettagli SET fornitore = '" & tbfornitore.text & "'"
sql = sql & "WHERE idpreventivo = '" & tbidpreventivo.Text & "'"
MODMain.Connect()
MyRS = MODMain.$conn.EXEC(sql)
Ciao, sono ancora in guerra con le query..
Devo fare una query di accodamento da tabella DETTAGLI a tabella DETTAGLIORDINI.
Devo copiare i dettagli filtrati da IDPREVENTIVO e IDFORNITORE inoltre dovrei scrivere nei nuovi DETTAGLIORDINI l'idordine
Ho provato a fare questo (che naturalmente non va..)
PUBLIC MyRS AS Result
PUBLIC SUB accodadettagli()
DIM sql AS String
sql = "insert into dettagliordini (descrizione, idordine)values "
sql = sql & "SELECT descrizione, " & tbidordine.Text
sql = sql & "FROM dettagli"
sql = sql & "WHERE idpreventivo = '" & tbidpreventivo.Text & "'" ""
sql = sql & "and idfornitore = '" & tbidfornitore.Text & "'" ""
MODMain.Connect()
MyRS = MODMain.$conn.Exec(sql)
END
Dove sbaglio?
A parte le stampe questo dovrebbe essere uno dei ultimi problemi.
Ho quasi finito il mio programma :-), sono contento è venuto una figata, vedrete!
Lo posto presto (appena ho risolto questo problema e finito l'ultima form)
Ciao grazie
Premetto che non ho avuto modo di provare il tuo progetto, quindi non conoscendo la logica con cui hai impostato le tabelle del DB mi viene un po' in salita aiutarti, però alcune cose non corrette le ho notate:
L'Insert così come l'hai strutturato tu non vuole la clausola Values che va' cancellata.
Nella seconda riga, per intenderci quella dove hai inserito SELECT non mi sembra sintatticamente corretta.
Qualcosa di strano mi pare che ci sia anche nelle altre righe:
troppi apici.
Prova così
PUBLIC MyRS AS Result
PUBLIC SUB accodadettagli()
DIM sql AS String
sql = "INSERT INTO dettagliordini (descrizione, idordine)"
sql &= "SELECT descrizione, '" & tbidordine.Text & "'"
sql &= "FROM dettagli"
sql &= "WHERE idpreventivo = '" & tbidpreventivo.Text & "'"
sql &= "AND idfornitore = '" & tbidfornitore.Text & "'"
MODMain.Connect()
MyRS = MODMain.$conn.Exec(sql)
END
Mitico!!
Funziona alla grande, mancava uno spazio ma ho risolto subito.
Sono 2 giorni che provo a girarla in tutte le maniere..
Ti ringrazio tantissimo
per chi può interessare il codice:
PUBLIC MyRS AS Result
PUBLIC SUB accodadettagli()
DIM sql AS String
sql = "INSERT INTO dettagliordini (descrizione, idordine)"
sql &= "SELECT descrizione, '" & tbidordine.Text & "'"
sql &= "FROM dettagli "
sql &= "WHERE idpreventivo = '" & tbidpreventivo.Text & "'"
sql &= "AND idfornitore = '" & tbidfornitore.Text & "'"
MODMain.Connect()
MyRS = MODMain.$conn.Exec(sql)
END
Esempio:
DIM i AS Integer
FOR EACH mioResult
i = mioResult.Index
GridView[i, Colonna].Alignment = 2
GridView[i, Colonna].Text = mioResult["prezzo"]
NEXT
Colonna = Nr. Colonna che visualizza i prezzi
Ciao, appena tornato e prima di andare a nanna vi faccio subito una domandina :-)
(Mi mancavate tanto!! :lol: :lol: )
La questione è importare da file csv.
Ho torvato questo, che si lancia da terminale, l'esempio è di importare dei nomi in un database di nome Rubrica con tabella Amici con campi Cognome;Nome;Numero.
mysql -u root -p
use Rubrica
LOAD DATA LOCAL INFILE '/home/franco/Gestione/export.csv'
INTO TABLE Amici
FIELDS TERMINATED BY ';'
enclosed by '"'
LINES TERMINATED BY '\n'
(Cognome, Nome, Numero);
E fin quà funziona. Però io volevo farlo con una query, è possibile?
Ciao grazie
Grazie per i suggerimenti di tutti,
La mia prima intenzione era di importare i dati di csv al db mysql direttamente da gambas, però non sapendolo fare volevo provare la scorciatoia della shell.
@md9327
Se non è chiedere troppo questo sarebbe quello che devo fare:
da un file xls converto in csv, questo è il risultato (CODICE;DESCRIZIONE;PREZZO)
ba45;base da 45;45,23
ba30;base da 30;30,11
pe22;pensile da 22;22,22
al posto della virgola come separatore di campo ho preferito il puntoevirgola perchè ho paura che vada in conflitto con la virgola del campo prezzo
Devo andare a copiare i dati nella tabella "dettaglilistini", i campi interessati sono questi:
codice ----varchar(50)
descrizione ----varchar(250)
prezzo ----decimal(10,2)
idfornitore ----int(4)
fornitore ----varchar(50)
Codice descrizione e prezzo sono i campi interessati ai dati del csv, mentre idfornitore e fornitore dovranno avere gli stessi valori su tutti i record copiati,
idfornitore = 2
fornitore = "pippo"
Ti faccio anche un esempio di come mi collego al db
sql = "select * from dettaglilistini"
MODMain.Connect()
MyRS = MODMain.$conn.Exec(sql)
Ho fatto un bel poema... :oops:
Ti ringrazio
Il file che ho postato non è altro che una classe.
Per poter leggere e fare quello che devi fare, devi, all'interno del tuo codice, creare una variabile di tipo Csv (nome della classe), aprire la connessione con il file (OpenFile), leggere i dati con un loop (fino a che Read non ritorna False), chiude la connessione con il file (Close).
Un esempietto:
DIM csv AS NEW pgCsv()
DIM dati as String[]
csv.OpenFile($filename)
WHILE csv.Read()
dati = csv.Data
WEND
csv.Close()
Ora devo scappare, appena ritorno e se necessario ti dò qualche altra info...
Bye
Ciao
Ho preparato l'esempio un po' in fretta, in effetti sul mio progetto fccio così:
Ho un modulo chiamato “ModMain” (l'ho trovato sempre qua nel forum”
PUBLIC $conn AS NEW Connection
PUBLIC PROCEDURE Connect()
$conn.Close
$conn.Type = "mysql"
$conn.Host = "localhost"
$conn.Login = "root"
$conn.port = "3306"
$conn.Name = "Gestione"
$conn.Password = "MIAPASSWORD"
$conn.Open
END
PUBLIC SUB Main()
Connect() 'avvia la procedura per la connessione
END
Riempio la grid con questo codice:
PUBLIC MyRS AS Result
PUBLIC SUB riempigrid()
DIM sql AS String
DIM i AS Integer
DIM cal AS String
GridView1.Clear
sql = "select * from dettagli WHERE idpreventivo LIKE '%" & tbidpreventivo.Text & "%'" " " ' tbidpreventivo è l'id per filtrare i dettagli solo per questo preventivo
sql = sql & "order by iddettaglio"
MODMain.Connect()
MyRS = MODMain.$conn.Exec(sql)
IF MyRS.Available = TRUE THEN
GridView1.Mode = Select.multiple
GridView1.Header = GridView1.Horizontal
GridView1.Columns.Count = 10
GridView1.Columns[0].Width = 20
GridView1.Columns[1].Width = 20
GridView1.Columns[2].Width = 80
GridView1.Columns[3].Width = 400
GridView1.Columns[4].Width = 80
GridView1.Columns[5].Width = 20
GridView1.Columns[6].Width = 20
GridView1.Columns[7].Width = 20
GridView1.Columns[8].Width = 80
GridView1.Columns[9].Width = 80
GridView1.Rows.Height = 20
GridView1.Columns[0].Text = ""
GridView1.Columns[1].Text = "Q.tà"
GridView1.Columns[2].Text = "Codice"
GridView1.Columns[3].Text = "Descrizione"
GridView1.Columns[4].Text = "Prezzo"
GridView1.Columns[5].Text = "IVA"
GridView1.Columns[6].Text = "Aum"
GridView1.Columns[7].Text = "Sco"
GridView1.Columns[8].Text = "Prezzo tot"
GridView1.Columns[9].Text = "Fornitore"
GridView1.Rows.Count = MyRS.Count
i = 0
FOR EACH MyRS
GridView1[i, 0].Picture = ""
GridView1[i, 1].Text = MyRS!quantita
GridView1[i, 2].Text = MyRS!codice
GridView1[i, 3].Text = MyRS!descrizione
GridView1[i, 4].Alignment = 2
GridView1[i, 4].Text = MyRS!prezzo
GridView1[i, 5].Text = MyRS!iva
GridView1[i, 6].Text = MyRS!maggiorazione
GridView1[i, 7].Text = MyRS!sconto
GridView1[i, 8].Alignment = 2
cal = (((MyRS!prezzo * MyRS!quantita) * ((MyRS!iva / 100) + 1)) * ((MyRS!maggiorazione / 100) + 1)) * (1 - (MyRS!sconto / 100))
GridView1[i, 8].Text = Format(cal, "######0.00")
GridView1[i, 9].Text = MyRS!fornitore
INC i
NEXT
ELSE
GridView1.Columns.Count = 1
GridView1.Rows.Count = 1
GridView1[0, 0].Text = "Nessun dato"
ENDIF
CATCH
Message.Error(Error.Text)
END
Un dubbio: MODMain.Connect() io lo uso in ogni funzione. E' giusto o devo metterlo in “Form_Open” ?
Mi sono guardato bene la tua classe, purtroppo io non ci capisco molto, però ho capito che si può scegliere il carattere separatore colonna, la prima riga per il nome colonna .. però più in là non riesco andare.
Il lavoro che vorrei fare io sarebbe di accodare il csv nella mia tabella "dettaglilistino" . Il file CSV deve essere preparato prima, penso che qualsiasi utente con una guida (che preparerò) sia capace di convertire con OpenOffice un file xls. Poi dalla maschera “Listini” scegliendo il file mi copierà i dati del csv (però dovrò riempiere anche i campi Idlistino e Idfornitore con i valori che ci saranno nella maschera al momento dell'importazione)
Spero di essermi spiegato meglio adesso, sono un po' casinista di natura :-)
Ti ringrazio tanto del tempo che mi dedichi
[OT]
Scusate se esco dai ranghi delle richieste ma leggendo il codice ho notato una cosa: quando fai riferimento ai dati di login vengono scritti direttamente...più precisamente
$conn.Login = "root"
$conn.Password = "MIAPASSWORD"
Questo non è un pò controproducente per la sicurezza? Non dovresti creare un form in cui l'utente inserisce login-name e password?
/OT]
Mi farebbe molto piacere!
All'avvio del programma si apre il form "Principale", là (nella funzione Form_open) viene controllato se è stato creato il file /.Gestione/dati.txt e quindi anche conn.txt che è il file dove scrivo i dati per collegarmi al database. Puoi scaricare l'ultimo aggiornamento che ho fatto qualche giorno fà, nella pagina precedente di questa. Però devi cambiare la funzione Form_open con questa perchè mi ero dimenticato un particolare.
PUBLIC SUB Form_Open()
DIM hFile AS File
DIM Dato1 AS String
label2.Text = Format(Now(), "dddd dd mmmm yyyy")
IF NOT Exist(User.Home & "/.Gestione/Dati.txt") THEN
MKDIR (User.Home & "/.Gestione")
impostazioni.Show
connessione.Show
ELSE
hFile = OPEN User.Home & "/.Gestione/Dati.txt" FOR INPUT
LINE INPUT #hFile, Dato1
CLOSE #hFile
lbintestazione.text = Dato1
END IF
ME.Center
END
Vedi te come fare, mi fido ...ceskhamente :-D
Stupendo ceskho, ci ho messo un pò le mani ma è una figata.
Il modulo modMain serve, allora ho fatto .. non so come si chiamano (STATIC PUBLIC t$Type AS String). Quando mi connetto vado a "scrivere" i dati su questa, modMain "legge" da questa.
Fantastico grazie :-) :2birre:
p.s. io ti allego perchè mi fa piacere che vedi il tuo lavoro, ma non stò inserendo troppi allegati? :nulla:
edit:
ho dimenticato una cosa: cambia questa funzione nella classe "Principale"
PUBLIC SUB Form_Open()
DIM hFile AS File
DIM Dato1 AS String
DIM con1, con2, con3, con4, con5, con6 AS String
label2.Text = Format(Now(), "dddd dd mmmm yyyy")
IF NOT Exist(User.Home & "/.Gestione/tblogin.txt") THEN
dtbLogin.Show
ELSE
hFile = OPEN User.Home & "/.Gestione/Conn.txt" FOR INPUT
LINE INPUT #hFile, con1
LINE INPUT #hFile, con2
LINE INPUT #hFile, con3
LINE INPUT #hFile, con4
LINE INPUT #hFile, con5
LINE INPUT #hFile, con6
CLOSE #hFile
Global.t$Type = con1
Global.t$Host = con2
Global.t$Login = con3
Global.t$port = con4
Global.t$Name = con5
Global.t$Password = con6
ENDIF
IF NOT Exist(User.Home & "/.Gestione/Dati.txt") THEN
MKDIR (User.Home & "/.Gestione")
impostazioni.Show
ELSE
hFile = OPEN User.Home & "/.Gestione/Dati.txt" FOR INPUT
LINE INPUT #hFile, Dato1
CLOSE #hFile
lbintestazione.text = Dato1
END IF
ME.Center
END
Si scusa, non mi sono spiegato per niente..
Ho letto i tuoi post dell'anno scorso qui (http://www.gambas-it.org/gmbs/modules/newbb/viewtopic.php?topic_id=81&viewmode=flat&order=ASC&type=&mode=0&start=30), grazie a questo ho cominciato a capirci qualcosa con le stampe :-D
E ho visto che hai avuto anche tu la problematica di allineare, nelle stampe, a destra un campo con decimali (prezzo).
Hai scritto questo:
FOR EACH xResult
Draw.Text(codice, x, y)
codice = xResult!cdart
Draw.Text(articolo, x + xinc1, y)
articolo = xResult!descrizione
Draw.Text(prezzo, x + 3000, y, Align.Right)
prezzo = Format(xResult!prezzo2, "#0.00")
NEXT
poi avete parlato di "rettangolo testuale" ma non ho capito cosa sia..
Avresti un esempietto? Grazie
Grazie fsurfing. Sai ho scoperto che è molto bello impostare le stampe :-)
Questo è quello che ho fatto, non so come allineare i prezzi però
PUBLIC SUB btnstampa_Click()
DIM sql AS String
DIM x AS Integer
DIM xquant AS Integer
DIM xcod AS Integer
DIM xprez AS Integer
DIM xdescr AS Integer
DIM y AS Integer
DIM valorepag AS Integer
DIM valoreymax AS Integer
DIM valoreynewpage AS Integer
valorepag = 1
valoreymax = 6800
valoreynewpage = 200
sql = "select * from dettagli WHERE idpreventivo LIKE '%" & tbidpreventivo.Text & "%'" " "
sql = sql & "order by iddettaglio"
MyRS = MODMain.$conn.Exec(sql)
'IF Printer.Setup() THEN RETURN 'fai apparire il modulo di conf. stampante
Printer.Name = "PDF" ' nome stampante imposto PDF per comodità
Draw.Begin(Printer) ' Initializes the draw
draw.LineWidth = 1
Draw.Foreground = color.Black
Draw.Background = color.White
PNTintestazione.stintestazione ' richiamo funzione intestazione
'''''''''''''''''
Draw.LineWidth = 10 '-- spessore
Draw.Line(100, 1000, 100, 6800) '-- coordinate di inizio e fine espresse nella coppia X,Y
draw.Font.Bold = TRUE ' grassetto
draw.Font.Italic = FALSE ' italico
draw.Font.size = 7 ' dimensione
draw.text("Pag. " & valorepag, 4400, 6850) ' scrivo il n° prima pagina
draw.Font.size = 10 ' dimensione
x = 100
y = 1000
xquant = 100
xcod = 250
xdescr = 900
xprez = 4000
IF MyRS.Available = TRUE THEN
FOR EACH MyRS
draw.text(MyRS!quantita, xquant, y)
draw.text(MyRS!codice, xcod, y)
draw.text(MyRS!descrizione, xdescr, y)
draw.text(MyRS!prezzo, xprez, y) ' quà non so come incolonnare il prezzo a dx
y = y + 150
IF y > valoreymax THEN
printer.newpage()
Y = valoreynewpage
valorepag = valorepag + 1
draw.Font.size = 7 ' dimensione
draw.text("Pag. " & valorepag, 4400, 6850) ' scrivo il n° pagine successive
draw.Font.size = 15 ' dimensione
ENDIF
NEXT
ENDIF
''''''''''
Draw.end
''questo comando è provvisorio
WAIT 2 ' aspetto 2 secondi per poi aprire il pdf
SHELL "evince " & User.Home & "/PDF/_stdin_.pdf" 'apro il pdf (non sò perchè lo chiama _stdin_.pdf ???) è provvisorio
END
per il prezzo fai così
mi pare di capire che la colonna dei prezzi inizi a 4000 pixel
io ipotizzo che finisca a 5000 tu correggi di conseguenza
draw.text(MyRS!prezzo, xprez+1000-draw.textwidth(MyRS!prezzo), y) '
logicamente tutti i prezzi dovranno essere formattati allo stesso modo ad esempio tutti con due decimali
@md9327
Ho guardato bene il sito FPDF, mi sono concentrato nel tutorial "Esempio Minimo", ho provato applicarlo in gambas, anche cercando di capire guardando il tuo "PdfWriter". Ho provato a fare un esempio, mi sono caricato la classe Pdfwriter, ho attivato il componente gb.pdf, e ho cercato di tradurre "l'esempio minimo", senza risultati..
Per favore mi fai andare questo esempio?
PUBLIC SUB Button1_Click()
DIM pdf AS PdfWriter
pdf = NEW PdfWriter("P", "mm", "A4")
pdf.AddPage()
pdf.SetFont("Arial", "B", "16")
pdf.Cell(40, 10, "Hello World!")
pdf.Output(Application.Path &/ "prova.pdf", FALSE)
CATCH
Message.Error(Error.Text & "\n" & Error.Where)
END
L'esempio tuo Pdfwriter, non mi va, non sò dove posso aver sbagliato qualcosa, mi esce questo:
Ciao grazie
La libreria PdfWriter non ha bisogno di quella Gambas gb.pdf, perchè il file lo scrive e non lo legge.
Per prima cosa ti porti PdfWriter all'interno del tuo progetto.
Dato che la classe è dichiarata PRIVATE, devi necessariamente crearne una tua derivata da PdfWriter, scrivendo la seguente istruzione all'inizio del file della tua classe:
Al suo interno PdfWriter ha tutte le funzionalità per scrivere pagine pdf, ma chiama due metodi, che devono essere presenti nella tua classe derivata:
PUBLIC FUNCTION Footer()
...
END
PUBLIC SUB Header()
...
END
Questi due metodi ti permettono di scrivere sulla pagina corrente, ovvero:
Footer: ti permette di scrivere sul fondo pagina, come ad esempio il numero della pagina corrente;
Header: ti permette di scrivere sulla testata della pagina.
I metodi vengono chiamati ad ogni nuova pagina, ma puoi anche evitare di utilizzarle.
In linea di principio, l'uso di PdfWriter prevede:
1) creazione del documento, con le impostazioni di formato pagina (Landscape o Portrait), unità di misura (es mm=millimetri), dimensione della pagina (es. A4).
2) impostazione di alcune informazioni facoltative, ad es.: autore, creatore, soggetto, titolo, ecc.
3) apertura del documento (Open)
4) impostazione del numero di pagine totale (AliasNbPages)
5) scrittura della testata (Header)
6) gestione delle pagine (AddPage, Bookmark), del colore (SetTextColor) e del font (SetFont)
7) scrittura del contenuto, ad es.:
- una serie di celle contenenti testo
- testo libero in vari formati, font, colori, e posizione
- immagini
- varie combinazioni
Implementando opportunamente la tua classe, puoi aggiungere ulteriori funzionalità, come ad esempio la lettura di un file o una tabella da un database, riportando i dati in formato colonnare sul documento pdf.
Io personalmente lo uso per creare dei report da un database, e per formattare le pagine di fatture.
Quindi, ritornando al tuo codice, la prima cosa da fare è quella di creare una nuova classe derivata da PdfWriter, dopodiche il resto del tuo esempio credo possa andare, ma poi lo vedrai nel risultato finale.
Solo una nota: prima di scrivere nel documento, è necessario prima aprirlo con Open(); quindi, prima di AddPage, è necessario aggiungere un bel:
altrimenti PdfWriter resta bloccato in uno stato inattivo...
Diciamo che questa è una prassi generale nella programmazione...
La funzione di chiusura viene eseguita automaticamente dal metodo Output().
Più avanti ti indicherò qualche altra dritta per gestire, ad esempio la stampa del numero di pagina a fondo, o del totale pagine...
Ho un altro problemino: :-)
Ho fatto due funzioni che mi permettono di scorrere tra le righe di una gridview.
Ho fatto due pulsanti, e funziona benissimo.
Però volevo anche usare i tasti "up" e "down", allora ho fato questo
IF key.code = Key.Up THEN
btup_Click
STOP EVENT
ENDIF
IF key.code = Key.Down THEN
btdown_Click
STOP EVENT
ENDIF
Praticamente richiama la funzione fatta dai bottoni.
Questo funziona, però solo finche non vado a cliccare una combobox che ho nel form, fatto ciò up e down da tastiera non funzionano più, se premo i bottoni del form funziona lo spostamento e anche si riattivano i pulsanti da tastiera. Credo che si dica "ho perso il focus" :oops: Giusto?
@ Ceskho
So che hai avuto un problema del genere per la calcolatrice, ho guardato ma non ho capito tanto..anzi niente :-)
Ciao grazie
Ti ringrazio, stasera provo, ho anche trovato questo, scritto da fsurfing
GridView1.Mode=select.single
'oppure
gridview1.mode=select.none
'oppure
gridview1.mode=select.multiple
Ciao grazie
Risolto, ho fatto così.
Ho disattivato mode, gridview1.mode=select.none
Poi ad ogni mio spostamento nella grid coloro la riga interessata di azzurro così
GridView1[myrow, 1].Background = &H7FFFFF&
GridView1[myrow, 2].Background = &H7FFFFF&
....
Risultato ottimo :-)
Ciao, volevo fare un combobox autocompletante.
Cioè quando comincio a scrivere mi ricerca e mi completa la parola che ho in lista.
Riempio il combobox cosi:
MyRS = MODMain.$conn.Exec("select * from fornitori order by fornitore")
IF MyRS.Available = TRUE THEN
tbfornitore.clear
MyRS.movefirst
FOR i2 = 0 TO Myrs.count - 1
tbfornitore.add(MyRS!fornitore, i2)
MyRS.movenext
NEXT
ENDIF
Ciao grazie
Ho fatto qualcosa riguardo la combobox autocompletante.
Intanto non ci vuole una combobox ma un testbox.
Ecco questo è il codice che ho fatto fino adesso, funziona abbastanza bene.
PUBLIC SUB tbauto_Change()
DIM sql AS String
DIM p AS Integer
DIM myfiltro AS String
DIM risu AS String
DIM lungrisu AS Integer
p = tbauto.Pos
IF p > 0 THEN
myfiltro = Left$(tbauto.Text, p)
sql = "select * from clienti WHERE "
sql = sql & "cognome LIKE '%" & myfiltro & "%'" " "
sql = sql & "order by cognome"
MyRS = MODMain.$conn.Exec(sql)
IF MyRS.Available = TRUE THEN
MyRS.movefirst
risu = MyRS!cognome
lungrisu = Len(risu)
tbauto.Text = myfiltro & Right$(risu, (lungrisu - p))
tbauto.Pos = p
ELSE
tbauto.Text = myfiltro
tbauto.Pos = p
ENDIF
ENDIF
END
Ha questo problema:
Se cerco un cognome es. Rossi, digitanto "r" prima di darmi Rossi mi trova altri cognome con la lettera "r" che non è per forza la prima lettera, esempio "baraldi" dandomi questo risultato quà "raraldi"
Avete qualche idea di come risolvere questo errore?
Ciao grazie
@Ceskho
Stasera sono in vena, mi è saltata per la testa la radice quadrata √ , e l'ho inserita nella tua calcolatrice
PUBLIC SUB radquad_Click()
'-- aggiorna il nastro
''simbolo tasto √;
tNastro.Text &= tVal.Text & " √" & gb.NewLine
tVal.Text = Sqr(Val(tVal.Text))
tNastro.Text &= tVal.Text & gb.NewLine
tNastro.EnsureVisible()
ugu.SetFocus
operazione = ""
virgola = FALSE
other = FALSE
END
edit:
il simbolo è questo √, non so come mai quà vengono fuori quei numeri
Ciao, ho il seguente problema:
in una rubrica ho messo un testo di ricerca che cerca su Cognome Nome e Citta.
Eccola quà
sql = "select * from clienti WHERE "
sql = sql & "cognome LIKE '%" & tbricerca.Text & "%'" " "
sql = sql & "OR nome LIKE '%" & tbricerca.Text & "%' "
sql = sql & "OR citta LIKE '%" & tbricerca.Text & "%' "
sql = sql & "order by cognome"
e funziona.
Però adesso ho bisogno di filtrare anche per categoria.
Categoria può essere 1 o 2.
Dopo varie prove ho visto che funziona solo se tolgo dalla ricerca nome e citta,
cioè così
sql = "select * from clienti WHERE "
sql = sql & "cognome LIKE '%" & tbricerca.Text & "%' "
sql = sql & "AND categoria = 1 "
sql = sql & "order by cognome"
Dove sbaglio? mi servirebbe la ricerca su tutti e 3 i campi.
Prova con
sql = "select * from clienti WHERE "
sql = sql & "cognome LIKE '%" & tbricerca.Text & "%' "
sql = sql & "AND categoria = 1 "
sql = sql & "OR categoria = 2 "
sql = sql & "order by cognome "
no, cosi non va. dovrei fare così
sql = "select * from clienti WHERE "
sql = sql & "cognome LIKE '%" & tbricerca.Text & "%' "
sql = sql & "OR nome LIKE '%" & tbricerca.Text & "%' "
sql = sql & "OR citta LIKE '%" & tbricerca.Text & "%' "
sql = sql & "AND categoria = 1 "
sql = sql & "order by cognome"
ma comunque non va....
Golia ha scritto:
sql = "select * from clienti WHERE "
sql = sql & "cognome LIKE '%" & tbricerca.Text & "%'" " "
sql = sql & "OR nome LIKE '%" & tbricerca.Text & "%' "
sql = sql & "OR citta LIKE '%" & tbricerca.Text & "%' "
sql = sql & "order by cognome"
La sintassi che hai usato e formalmente corretta, quindi se aggiungi la ricerca per categoria deve funzionare.
sql = "SELECT * FROM clienti"
sql &= " WHERE cognome LIKE '%" & tbricerca.Text & "%'"
sql &= " OR nome LIKE '%" & tbricerca.Text & "%'"
sql &= " OR citta LIKE '%" & tbricerca.Text & "%'"
sql &= " AND categoria = 1"
sql &= " ORDER BY cognome"
In caso contrario prova la query direttamente sul DB, così puoi capire se il problema dipende da qualche errore di codice in Gambas o da qualche problema/impostazione sul DB.
Un altro consiglio: verifica con il debug di Gambas.
Se non risolvi posta eventuali messaggi di errore..
Grazie ragazzi, ho risolto.
Ho seguito il consiglio di tornu, ho smanettato direttamente dal db con mysql browser, provando le più svariate combinazioni. Quella giusta è questa
sql = "SELECT * FROM clienti"
sql &= " WHERE (cognome LIKE '%" & tbricerca.Text & "%'"
sql &= " OR nome LIKE '%" & tbricerca.Text & "%'"
sql &= " OR citta LIKE '%" & tbricerca.Text & "%')"
sql &= " AND categoria = 1"
sql &= " ORDER BY cognome"
Ho messo le parentisi nelle ricerce con LIKE...funziona
Grazie mille
Un'altra cosina che avevo lasciato indietro..
Format(MyRS!prezzo, "######0.00")
Fino adesso ho formattato il campo prezzo così e mi restituisce questo
1550,00
se faccio così
Format(MyRS!prezzo, "####,##0.00")
1 550,00
se faccio così
Format(MyRS!prezzo, "####.##0,00")
1.550.000,00 ??? :-?
Come si fa a formattare in maniera corretta il campo prezzo, cioè così
1.550,00
Ciao grazie
penso sia così:
Format(MyRS!prezzo, "#.##0,00")
in alternativa puoi utilizzare una funzione fatta ad hoc per le tue esigenze :
PUBLIC SUB formatta(stringa AS String) AS String
DIM p, p1, itemp, itemp1 AS Integer
DIM initstringa AS String
''''sostituzione o aggiunta della virgola
IF InStr(stringa, ".") <> 0 THEN
stringa = Replace(stringa, ".", ",")
ELSE
stringa = stringa & ",00"
ENDIF
'''''arrotondamento a due decimali
p = InStr(stringa, ",")
p1 = Len(stringa) - p
initstringa = Left(stringa, p - 1)
IF p1 = 2 THEN
stringa = stringa
ELSE IF p1 <= 1 THEN
stringa = stringa & "0"
ELSE IF p1 > 2 THEN
itemp = CInt(Mid(stringa, p + 1, 2))
itemp1 = CInt(Mid(stringa, p + 1 + 2, 1))
IF itemp1 >= 5 THEN
INC itemp
ENDIF
IF itemp = 100 THEN
stringa = CString(CInt(initstringa) + 1) & ",00"
ELSE
stringa = initstringa & "," & CString(itemp)
ENDIF
ENDIF
''''''''''''aggiunta puntini ogni 1000
IF Len(stringa) >= 7 THEN
stringa = Mid(stringa, 1, (Len(stringa) - 6)) & "." & Right(stringa, 6)
ENDIF
IF Len(stringa) >= 11 THEN
stringa = Mid(stringa, 1, (Len(stringa) - 10)) & "." & Right(stringa, 10)
ENDIF
IF Len(stringa) >= 15 THEN
stringa = Mid(stringa, 1, (Len(stringa) - 14)) & "." & Right(stringa, 14)
ENDIF
IF Len(stringa) >= 19 THEN
stringa = Mid(stringa, 1, (Len(stringa) - 18)) & "." & Right(stringa, 18)
ENDIF
RETURN stringa
END
la funzione puoi lanciarla con
stringa_formattata=formatta(stringa_da_formattare)
:good:
Grazie fsurfing, bella funzione.
L'ho inserita e mi dava un problema quando vado a salvare nel DB.
Spiego: con la tua funzione vado a formattare il risultato del db per inserirlo nel textbox, e quì ok. Quando salvo, vado a leggere il textbox per salvarlo nel db, e qui da errore perchè trova punti e virgola che non ci dovrebbero essere (ho impostato il campo del db così: DECIMAL(10,2) ).
Allora (grazie a te che adesso ho imparato :-) ) ho fatto questa funzione che controlla il prezzo prima di salvarlo e lo formatta in maniera corretta.
PUBLIC SUB trasfvaluta(stringa AS String) AS String
''se scrivo l'importo con separatore decimale "." anzichè ","
IF Left(Right(stringa, (Len(stringa)) - (InStr(stringa, ".")) + 1), 1) = "." THEN
stringa = Left(stringa, (Len(stringa) - 3)) & "," & Right(stringa, 2)
ENDIF
''tolgo i punti di separatori migliaia
stringa = Replace(stringa, ".", "")
''cambio il separatore decimale da "," a "." per salvarlo in db
stringa = Replace(stringa, ",", ".")
RETURN stringa
END
Grazie mille :2birre:
Perdonatemi, il problema è vecchio, e io non ho più aggiornato il repository.
Se non vuoi attendere la nuova release (0.0.4) di PdfWrite, puoi inserire la seguente riga, appena dopo la riga [960]:
txt2 = Conv(txt2, "UTF-8", "ISO-8859-1")
La riga [960] contiene una serie di Replace della variabile txt2.
Questa modifica è opzionale, in alternativa puoi usare il consiglio di Ceskho.
A dire il vero, credo di aver omesso di aggiornare il repository, a causa dei dubbi sull'inserimento della funzione di conversione, perchè sarebbe il caso di restare su UTF-8, che sarà lo standard a livello generale.
Gambas2 usa UTF-8 per tutto, ma a volte si scontra con le impostazioni nel sistema, che potrebbero essere diverse, per cui è necessaria una conversione.
Anche gli altri linguaggi si basano di default su UTF-8.
Ciao, ho riscontrato il seguente problema:
Ho compilato il programma e installato il pacchetto DEB, tutto ok, però con questa funzione
Dialog.Filter = ["*.png", "file png"]
Dialog.Title = "Apri immagine"
IF Dialog.OpenFile() THEN RETURN
tbpathimage.Text = Dialog.Path
..quando vado ad cercare il file mi trovo in usr/bin.
Come devo fare per posizionarmi in una cartella da me definita?
Inoltre, quando devo dare un nome a un nuovo file uso questo:
Dialog.Filter = ["*.pdf", "file pdf"]
Dialog.Title = "Salva file PDF"
Dialog.Path = User.Home ' & "/Documenti"
IF Dialog.SaveFile() THEN RETURN
pdf.Output(Dialog.Path, FALSE)
Come faccio a posizionarmi nella cartella, e anche a dare l'estensione in automatico?
Grazie mille
Devi usare DIalog.Path prima di aprire la finestra...
Ad esempio se vuoi di default la home devi fare così:
Dialog.Filter = ["*.png", "file png"]
Dialog.Title = "Apri immagine"
Dialog.Path = User.Home
IF Dialog.OpenFile() THEN RETURN
tbpathimage.Text = Dialog.Path
Per il secondo punto non so aiutarti..scusami...