Nos meus fontes eu já usava classe, em muita coisa, então pra muita coisa foi só ajustar as classes.
O cadastro de veículos:
Código: Selecionar todos
PROCEDURE PJPVEICULO
LOCAL oFrm := JPVEICULOClass():New()
IF ! AbreArquivos( "jpcadastro", "jpcidade", "jpconfi", "jpempresa", "jpitem", "jpitped", ;
"jpnotfis", "jpnumero", "jppedido", "jppreco", "jpsenha", "jptabel", "jpuf" )
RETURN
ENDIF
oFrm:Execute()
RETURN
E a classe aplicada herança:
Código: Selecionar todos
CREATE CLASS JPVEICULOClass INHERIT FrmCadastroClass
VAR cDataTable INIT "JPVEICULO"
VAR cDataField INIT "IDVEICULO"
VAR axKeyField INIT { Space(6) }
VAR cnMySql INIT ADOClass():New( AppConexao() )
METHOD GridSelection()
METHOD Especifico( lExiste )
METHOD TelaDados( lEdit )
METHOD Valida( cCodigo, lMostra, cCampo )
ENDCLASS
No que o cadastro de veículso é diferente dos demais?
o browse, que pode ser usado em qualquer parte do aplicativo
Código: Selecionar todos
METHOD GridSelection() CLASS JPVEICULOClass
LOCAL oTBrowse, cnMySql := ADOClass():New( AppConexao() )
WITH OBJECT cnMySql
:cSql := "SELECT * FROM JPVEICULO ORDER BY VEPLACA"
:Execute()
oTBrowse := { ;
{ "CÓDIGO", { || StrZero( :Number( "IDVEICULO" ), 6 ) } }, ;
{ "PLACA", { || :String( "VEPLACA", 10 ) } }, ;
{ "MOTORISTA", { || :String( "VEMOTORI", 30 ) } }, ;
{ "TELEFONE", { || :String( "VETELEFONE", 20 ) } }, ;
{ "CAP.TOT", { || Transform( :Number( "VECAPACTOT" ), PicVal(6) ) } }, ;
{ "CAP.1", { || Transform( :Number( "VECAPAC1" ), PicVal(6) ) } }, ;
{ "CAP.2", { || Transform( :Number( "VECAPAC2" ), PicVal(6) ) } }, ;
{ "CAP.3", { || Transform( :Number( "VECAPAC3" ), PicVal(6) ) } }, ;
{ "CAP.4", { || Transform( :Number( "VECAPAC4" ), PicVal(6) ) } }, ;
{ "CAP.5", { || Transform( :Number( "VECAPAC5" ), PicVal(6) ) } }, ;
{ "CAP.6", { || Transform( :Number( "VECAPAC6" ), PicVal(6) ) } }, ;
{ "CAP.7", { || Transform( :Number( "VECAPAC7" ), PicVal(6) ) } }, ;
{ "CAP.8", { || Transform( :Number( "VECAPAC8" ), PicVal(6) ) } }, ;
{ "CAP.9", { || Transform( :Number( "VECAPAC9" ), PicVal(6) ) } } }
BrowseADO( cnMySql, oTBrowse, "VEPLACA,VEMOTORI,VETELEFONE", { || StrZero( :Number( "IDVEICULO" ), 6 ) } )
:CloseRecordset()
ENDWITH
RETURN NIL
escolher um código específico:
Código: Selecionar todos
METHOD Especifico( lExiste ) CLASS JPVEICULOClass
LOCAL GetList := {}, midVeiculo
midVeiculo := ::axKeyValue[ 1 ]
@ Row()+1, 20 GET midVeiculo PICTURE "@K 999999" VALID NovoMaiorZero( @midVeiculo )
Mensagem( "Digite código, F9 pesquisa, ESC sai" )
READ
Mensagem()
IF LastKey() == K_ESC .OR. ( Val( midVeiculo ) == 0 .AND. ::cOpc != "I" )
RETURN .F.
ENDIF
IF ! ::EspecificoExiste( lExiste, ADORecCount( "JPVEICULO", "IDVEICULO=" + StringSql( midVeiculo ) ) == 0 )
RETURN .F.
ENDIF
::axKeyValue := { midVeiculo }
RETURN .T.
A tela de edição, que tem muito lixo por sinal, e não parei pra retirar a parte inútil...
Código: Selecionar todos
METHOD TelaDados( lEdit ) CLASS JPVEICULOClass
LOCAL GetList := {}
LOCAL midVeiculo, mvePlaca, mveMotori, mveTelefone, mveCapacTot, mveCapac1, mveCapac2, mveCapac3
LOCAL mveCapac4, mveCapac5, mveCapac6, mveCapac7, mveCapac8, mveCapac9, mvePeso, mveInfInc, mveInfAlt
midVeiculo := ::axKeyValue[1]
WITH OBJECT ::cnMySql
mvePlaca := :String( "VEPLACA", 8 )
mveMotori := :String( "VEMOTORI", 30 )
mveTelefone := :String( "VETELEFONE", 20 )
mvePeso := :Number( "VEPESO" )
mveCapac1 := :Number( "VECAPAC1" )
mveCapac2 := :Number( "VECAPAC2" )
mveCapac3 := :Number( "VECAPAC3" )
mveCapac4 := :Number( "VECAPAC4" )
mveCapac5 := :Number( "VECAPAC5" )
mveCapac6 := :Number( "VECAPAC6" )
mveCapac7 := :Number( "VECAPAC7" )
mveCapac8 := :Number( "VECAPAC8" )
mveCapac9 := :Number( "VECAPAC9" )
mveInfInc := :String( "VEINFINC" )
mveInfAlt := :String( "VEINFALT" )
:CloseRecordset()
ENDWITH
hb_Default( @lEdit, .F. )
::nNumTab := 1
DO WHILE .T.
::ShowTabs()
DO CASE
CASE ::nNumTab == 1
@ Row() + 1, 1 SAY "Núm. Lançto......:" GET midVeiculo WHEN .F.
@ Row() + 2, 1 SAY "Placa............:" GET mvePlaca PICTURE "!!!-9999" VALID ValidaPlaca( @mvePlaca )
// @ Row() + 2, 1 SAY "CPF..............:" GET mveCPF PICTURE "@9" VALID OkGetCnpjCpf( @mvecpf, .T. )
@ Row() + 2, 1 SAY "Motorista........:" GET mveMotori PICTURE "@!" VALID ! Empty( mveMotori )
@ Row() + 1, 1 SAY "Telefone.........:" GET mveTelefone PICTURE "@!"
@ Row() + 1, 1 SAY "Capacidade Total.:" GET mveCapacTot PICTURE "999,999" VALID mveCapacTot > 0
@ Row() + 1, 1 SAY "Peso do Veículo..:" GET mvePeso PICTURE "999,999"
@ Row() + 1, 1 SAY "Capac.Tanque 1...:" GET mveCapac1 PICTURE "999,999"
@ Row() + 1, 1 SAY "Capac.Tanque 2...:" GET mveCapac2 PICTURE "999,999"
@ Row() + 1, 1 SAY "Capac.Tanque 3...:" GET mveCapac3 PICTURE "999,999"
@ Row() + 1, 1 SAY "Capac.Tanque 4...:" GET mveCapac4 PICTURE "999,999"
@ Row() + 1, 1 SAY "Capac.Tanque 5...:" GET mveCapac5 PICTURE "999,999"
@ Row() + 1, 1 SAY "Capac.Tanque 6...:" GET mveCapac6 PICTURE "999,999"
@ Row() + 1, 1 SAY "Capac.Tanque 7...:" GET mveCapac7 PICTURE "999,999"
@ Row() + 1, 1 SAY "Capac.Tanque 8...:" GET mveCapac8 PICTURE "999,999"
@ Row() + 1, 1 SAY "Capac.Tanque 9...:" GET mveCapac9 PICTURE "999,999"
@ Row() + 2, 1 SAY "Inf.Inclusão.....:" GET mveInfInc WHEN .F.
@ Row() + 1, 1 SAY "Inf.Alteração....:" GET mveInfAlt WHEN .F.
ENDCASE
//SetPaintGetList( GetList )
IF ! lEdit
CLEAR GETS
EXIT
ENDIF
Mensagem( "Digite campos, F9 Pesquisa, ESC Sai" )
READ
Mensagem()
::nNumTab += 1
IF LastKey() == K_ESC
EXIT
ENDIF
IF ::nNumTab > Len( ::acTabName )
EXIT
ENDIF
ENDDO
IF ! lEdit
RETURN NIL
ENDIF
::nNumTab := 1
IF LastKey() == K_ESC
RETURN NIL
ENDIF
WITH OBJECT ::cnMySql
:QueryCreate()
:QueryAdd( "VEPLACA", mvePlaca )
:QueryAdd( "VEMOTORI", mveMotori )
:QueryAdd( "VEPESO", mvePeso )
:QueryAdd( "VECAPACTOT", mveCapacTot )
:QueryAdd( "VECAPAC1", mveCapac1 )
:QueryAdd( "VECAPAC2", mveCapac2 )
:QueryAdd( "VECAPAC3", mveCapac3 )
:QueryAdd( "VECAPAC4", mveCapac4 )
:QueryAdd( "VECAPAC5", mveCapac5 )
:QueryAdd( "VECAPAC6", mveCapac6 )
:QueryAdd( "VECAPAC7", mveCapac7 )
:QueryAdd( "VECAPAC8", mveCapac8 )
:QueryAdd( "VECAPAC9", mveCapac9 )
IF ::cOpc == "I"
:QueryAdd( "VEINFINC", LogInfo() )
IF Val( midVeiculo ) == 0
midVeiculo := StrZero( :QueryExecuteInsert( "JPVEICULO" ), 6 )
ELSE
:QueryAdd( "IDVEICULO", midVeiculo )
:QueryExecuteInsert( "JPVEICULO" )
ENDIF
ELSE
:QueryAdd( "VEINFALT", LogInfo() )
:QueryExecuteUpdate( "JPVEICULO", "IDVEICULO=" + StringSql( midVeiculo ) )
ENDIF
ENDWITH
RETURN NIL
A validação de veículo e/ou placa que pode ser usada no aplicativo inteiro
Código: Selecionar todos
METHOD Valida( cCodigo, lMostra, cCampo ) CLASS JPVEICULOClass
LOCAL cnMySql := ADOClass():New( AppConexao() )
hb_Default( @lMostra, .T. )
hb_Default( @cCampo, "codigo" )
IF cCampo == "placa"
IF Len( AllTrim( cCodigo ) ) < 2
RETURN .T.
ENDIF
IF ! ValidaPlaca( cCodigo )
RETURN .F.
ENDIF
IF ADORecCount( "JPVEICULO", "VEPLACA=" + StringSql( cCodigo ) ) == 0
IF ! MsgYesNo( "Placa não utilizada antes. Continua?" )
RETURN .F.
ENDIF
WITH OBJECT cnMySql
:QueryCreate()
:QueryAdd( "VEPLACA", cCodigo )
:QueryExecuteInsert( "JPVEICULO" )
ENDWITH
ENDIF
ELSE
IF lMostra
@ Row(), 32 SAY Space(10)
ENDIF
cCodigo := StrZero( Val( cCodigo ), 6 )
IF ADORecCount( "JPVEICULO", "IDVEICULO=" + StringSql( cCodigo ) ) == 0
MsgExclamation( "Veículo não cadastrado" )
RETURN .F.
ENDIF
IF lMostra
@ Row(), 32 SAY ADOField( "VEPLACA", "C", "JPVEICULO", "IDVEICULO=" + StringSql( cCodigo ) )
ENDIF
ENDIF
RETURN .T.
Apenas ajustei o estilo DBF pra comportar o estilo ADO.
Mantendo o código caractere, apesar de salvar como numérico no MySQL, pra compatibilidade, até a completa migração pra MySQL.
Dizem que a GTWVG é complicada, enche de código fonte estranho dentro do fonte....
Tão vendo alguma coisa de GTWVG no fonte?
Pois é... uma IDE pra desenhar telas pra que? pra qual tela?