Ajuda com Minigui + SQL SERVER 2012

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

luiz antonio da silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 161
Registrado em: 21 Nov 2006 22:12
Localização: serrana-sp

Ajuda com Minigui + SQL SERVER 2012

Mensagem por luiz antonio da silva »

Boa noite pessoal !

Alguém teria um exemplo de conexão com MSSQL + minigui (ou hmg) com os dados para conexão e leitura dos dados ?

Estou trabalhando atualmente com MINIGUI EXT + ADODB + ORACLE 11g sem problemas, mas acredito que a empresa vá migrar
para SQL SERVER 2012, ví vários exemplos no forum e na net mas não consegui conexão nos testes.

** Pode ser que seja a string de conexão, tentei mudar...mas sinceramente não sei o que usar.

Se alguém puder dar-me uma luz (FAROL na verdade né...rs) ficarei grato.

Paz para todos.
Luiz.
HMG 3.4.4 - SQL SERVER - ORACLE
luiz antonio da silva
Usuário Nível 3
Usuário Nível 3
Mensagens: 161
Registrado em: 21 Nov 2006 22:12
Localização: serrana-sp

Ajuda com Minigui + SQL SERVER 2012

Mensagem por luiz antonio da silva »

Boa noite Novamente !

Buscando novas informações na net encontrei a solução com meu velho e bom companheiro...o ADODB...rs

ADODB.CH que uso com Oracle, firebird, MYSQL....e agora com SQL SERVER...rs

adodb.ch

Código: Selecionar todos

*
* Adodb.CH - Arquivo de Definição de Constantes do Sistema
*
//Tipo do Cursor
#Define adOpenForwardOnly     0  //adOpenForwardOnly = 0 # permite somente que você avance aos registros posteriores,perdendo-se os anteriores
#Define adOpenKeyset          1  //adOpenKeyset      = 1 # leitura e escrita (não permite ver alterações ou exclusões feitas por outros usuários)
#Define adOpenDynamic         2  //adOpenDynamic     = 2 # leitura e escrita (permite ver alterações ou exclusões feitas por outros usuários)
#Define adOpenStatic          3  //adOpenStatic      = 3 # permite somente leitura

//Tipo de travamento de Registros - LockType
#Define adLockReadOnly        1  //adLockReadOnly        = 1 somente leitura
#Define adLockPessimistic     2  //adLockPessimistic     = 2 Impede que outras sessões alterem o registro que estiver alocado pelo usuário
#Define adLockOptimistic      3  //adLockOptimistic      = 3 Todos podem alterar o mesmo registro
#Define adLockBatchOptimistic 4  //adLockBatchOptimistic = 4  Impede que outras sessões quando estiver em modo update batch

//Localização do Cursor - CursorLocation
#Define adUseServer  2
#Define adUseClient  3

//Estados dos RecordSets
#Define adEditNone       0
#Define adEditInProgress 1
#Define adEditAdd        2
#Define adEditDelete     4

//Tipos de dados retornados pelo DB
#Define RS_Empty              0     //Padrao Dbase C
#Define RS_TinyInt           16     //Padrao Dbase N
#Define RS_SmallInt           2     //Padrao Dbase N
#Define RS_integer            3     //Padrao Dbase N
#Define RS_BigInt            20     //Padrao Dbase N
#Define RS_UnsignedTinyInt   17     //Padrao Dbase N
#Define RS_UnsignedSmallInt  18     //Padrao Dbase N
#Define RS_UnsignedInt       19     //Padrao Dbase N
#Define RS_UnsignedBigInt    21     //Padrao Dbase N
#Define RS_Single             4     //Padrao Dbase N
#Define RS_Double             5     //Padrao Dbase N
#Define RS_currency           6     //Padrao Dbase N
#Define RS_Decimal           14     //Padrao Dbase N
#Define RS_Numeric          131     //Padrao Dbase N
#Define RS_Boolean           11     //Padrao Dbase N
#Define RS_Error             10     //Padrao Dbase C
#Define RS_UserDefined      132     //Padrao Dbase C
#Define RS_Variant           12     //Padrao Dbase C
#Define RS_IDispatch          9     //Padrao Dbase C
#Define RS_IUnknown          13     //Padrao Dbase C
#Define RS_GUID              72     //Padrao Dbase C
#Define RS_Date               7     //Padrao Dbase D
#Define RS_DBDate           133     //Padrao Dbase D
#Define RS_DBTime           134     //Padrao Dbase D
#Define RS_DBTimeStamp      135     //Padrao Dbase D
#Define RS_BSTR               8     //Padrao Dbase C
#Define RS_Char             129     //Padrao Dbase C
#Define RS_VarChar          200     //Padrao Dbase C
#Define RS_LongVarChar      201     //Padrao Dbase C
#Define RS_WChar            130     //Padrao Dbase C
#Define RS_VarWChar         202     //Padrao Dbase C
#Define RS_LongVarWChar     203     //Padrao Dbase C
#Define RS_Binary           128     //Padrao Dbase C
#Define RS_VarBinary        204     //Padrao Dbase C
#Define RS_LongVarBinary    205     //Padrao Dbase C
#Define RS_Chapter          136     //Padrao Dbase C
#Define RS_FileTime          64     //Padrao Dbase C
#Define RS_DBFileTime       137     //Padrao Dbase C
#Define RS_PropVariant      138     //Padrao Dbase C
#Define RS_VarNumeric       139     //Padrao Dbase C

#xcommand DECLARE CONNECTION <w> ;
   =>;
   #xtranslate <w>.\<p:BeginTrans,RollbackTrans,CommitTrans,close,execute\> => <w>:\<p\>;;

#xcommand DECLARE RECORDSET <w> ;
   =>;
   #xtranslate <w>.\<p:MoveNext,MovePrevious,MoveFirst,MoveLast,Find,AddNew,Update,Eof,Bof,close,CancelUpdate,Delete,Requery\> => <w>:\<p\>;;
   #xtranslate <w>->\<c>\.\<p:Value,Name,type\> => <w>:Fields\[\<(c)\>]:\<p\>;;
   #xtranslate <w>.\<c\>.\<p:Value,Name,type\> => YKKRETVALUE <w> \<(c)\> \<p\> 

   #xtranslate YKKRETVALUE <a> <b> <c> => <a>:Fields\[\<b>]:<c>

#xTranslate NEW RECORDSET <a>  => <a>:=CreateObject("ADODB.Recordset")
#xTranslate NEW CONNECTION <a> => <a>:=CreateObject("ADODB.Connection")
#command CLOSE CONNECTION <a> => <a>:close()
#command CLOSE RECORDSET <a> => <a>:close()
#xtranslate OPEN CONNECTION <b> STRING <(a)> => <b>:Open(<(a)>)
#command OPEN RECORDSET <a> CONNECTION <b> CURSORTYPE <d> LOCKTYPE <e> SQL <f> => <a>:Open(<f>,<b>,<d>,<e>)
#command ERROR CONNECTION <a> =>  if(<a>:Errors:Count>0,MsgStop("Erro Nativo: "+alltrim(Str(<a>:Errors\[0\]:NativeError))+chr(13)+chr(10)+"Descrição..: "+<a>:Errors\[0\]:Description),Nil)

/********************** Com estas linhas funciona com Harbour
*********************/
#ifdef __HARBOUR__
//ANNOUNCE HB_GTSYS
ANNOUNCE HB_GTSYS
REQUEST HB_GT_GUI_DEFAULT
#xcommand TRY => BEGIN SEQUENCE WITH s_bBreak
#xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr->
#xcommand FINALLY => ALWAYS
static s_bBreak := { |oErr| break( oErr ) }
#endif
/********************* Com estas linhas funciona com Harbour
*********************/
Programa exemplo, conecta e le registros na tabela Role do banco ReportServer do SQL SERVER 2012 EXPRESS

sql.prg

Código: Selecionar todos

#include <minigui.ch>
#include <adodb.ch>

*-------------------------------------------------------------------------*
Function Main
*-------------------------------------------------------------------------*
set date brit
set century on

// CONEXÃO COM SQL SERVER 2012 EXPRESS
	CON:="S"
	Try
		MSQL:=CreateObject("ADODB.Connection")
		MSQL:Open("Driver={SQL Server};Server=localhost;Trusted_Connection=Yes;Database=ReportServer;")
	Catch err
		Msginfo("Erro de conexão com SQL Server: "+err:description)
		Close(MSQL)
	End
*************************************************************************************************

MSGINFO("CONECTADO")

CMDSQL:="select count(*) as regs from Roles"
Try	
	Retorno:=MSQL:EXECUTE(CMDSQL)
Catch erro
	msginfo("erro: "+err:description)
	return
end

Msginfo(str(Retorno:fields["REGS"]:VALUE))
	
RETU
do mais, foi instalar o DRIVER ODBC (No meu caso o de 32b) encontrado no seguinte link

http://www.microsoft.com/pt-br/download ... x?id=36434

e é isso...blz?

Luiz.
HMG 3.4.4 - SQL SERVER - ORACLE
mmatos566
Usuário Nível 1
Usuário Nível 1
Mensagens: 1
Registrado em: 27 Set 2018 16:36
Localização: Santarém

Ajuda com Minigui + SQL SERVER 2012

Mensagem por mmatos566 »

CMDSQL:="SELECT ID_LANCAMENTO" + ;
", ID_NOTA" + ;
", ID_PRODUTO" + ;
", VALOR" + ;
", QUANTIDADE_PADRAO" + ;
", QUANTIDADE" + ;
", ALIQUOTA" + ;
", PERCENTUAL_DESCONTO" + ;
", VALOR_DESCONTO" + ;
", CODIGO_FISCAL" + ;
", DATA_LANCAMENTO" + ;
" FROM sgc_dpop_xv.dbo.PDV_NOTA_FISCAL_DETALHES"



Retorno:=MSQL:EXECUTE(CMDSQL)
COMO PEGAR OS DADOS DESTE SELECT

O (Retorno) NAO SEI COMO LER OS DADOS DESTE OETO
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Ajuda com Minigui + SQL SERVER 2012

Mensagem por alxsts »

Olá!

Se preferir ADO veja o exemplo abaixo, em SQL Server. Abre uma conexão, executa uma stored procedure e exibe o record set resultante através de um TBrowseDB() no próprio objeto retornado ( note as funções ADORecordSetSkipper() e ADORecordSetFieldBlock() ). Fiz uma alteração nesta última mas no momento estou sem SQL Server e não testei. Qualquer coisa ajustamos.

Código: Selecionar todos

/*
        Exibição das linhas de um Record set ADO usando TBrowseDB()

        Alexandre Santos

        Compilar: Hbmk2 tbado hbwin.hbc
*/

#include "tbrowse.ch"
#include "inkey.ch"
#include "setcurs.ch"
#include "box.ch"
#include "set.ch"
#include "ado.ch"

FUNCTION Teste()

   LOCAL oCn, oCmd, oRs, oTbr As Object
   LOCAL i, nLen, nKey, nRecno As Numeric
   LOCAL cCnString as Character
   LOCAL bErr := ErrorBlock( __BreakBlock() ), oErr

   Set( _SET_DATEFORMAT, "dd/mm/yyyy" )

   BEGIN SEQUENCE

      /*
           Ajuste aqui a connection string conforme o banco

           Ou pequise aqui...: https://www.connectionstrings.com/]
      */
      
      // SQL Server 2008 R2
      cCnString := "Provider=SQLNCLI10;Server=172.16.40.5;Database=NomeBanco;Uid=usuario;Pwd=senha;"

      oCn := win_OleCreateObject("ADODB.Connection")

      oCn:ConnectionString := cCnString
      oCn:CursorLocation := adUseClient
      oCn:Mode := adModeReadWrite

      oCn:open()
      
      oCmd := win_OleCreateObject("ADODB.Command")

      oCmd:ActiveConnection := oCn
      // Prepare the stored procedure
      oCmd:CommandText := "spCountryGetAllRows"
      oCmd:CommandType := adCmdStoredProc

      DispOutAt( MaxRow(), 3, " Obtendo registros... ", "N/W" )

      // Execute the stored procedure
      // This returns a recordset

      oRs := oCmd:Execute()

      DispOutAt( MaxRow(), 3, Space(22), "W/W" )

      oCmd := NIL

      IF oRs != NIL
         oTbr := TBrowseDB():new( 04, 3, MaxRow() - 7, MaxCol() - 3 )

         // Separators
         oTbr:headSep   := DEF_HSEP
         oTbr:colSep    := DEF_CSEP
         oTbr:footSep   := DEF_FSEP
         oTbr:cargo     := oRs:bookMark

         // Navigation code blocks for Record Set
         oTbr:goTopBlock    := { || oRs:moveFirst() }
         oTbr:goBottomBlock := { || oRs:moveLast() }
         oTbr:skipBlock     := { |n| ADORecordSetSkipper( oRs,n ) }

         // Colors
         oTbr:colorSpec := "N/W, W+/BG,N/W*"

         // create TBColumn objects and add them to TBrowse object - zero based
         nLen := oRs:fields():count() - 1
         FOR i := 0 TO nLen
            // add code block for individual columns of the record set
            oColumn := TBColumnNew( oRs:fields(i):name(), ADORecordSetFieldBlock( oRs, i ) )
            // Column widths. For some data types, definedSize returns -1...
            oColumn:width := Max( Min( oRs:Fields(i):definedSize,50), Len( oRs:fields(i):name ) )

            /// TODO: set Column pictures

            // Add new column to TBrowse
            oTbr:addColumn( oColumn )
         NEXT

         // border
         DispBox( oTbr:nBottom, oTbr:nLeft - 1, oTbr:nBottom + 4, oTbr:nRight + 1, B_SINGLE + " " )
         DispBox( oTbr:nTop - 1, oTbr:nLeft - 1, oTbr:nBottom, oTbr:nRight + 1, B_SINGLE )

         DispBox( oTbr:nBottom, oTbr:nLeft - 1, oTbr:nBottom + 4, oTbr:nRight + 1, B_SINGLE + " " )

         nOldCursor := SetCursor( SC_NONE )


         IF ( oRs:eof() )
            DispOutAt( Int( ( oTbr:nBottom - oTbr:nTop ) / 2 ), oTbr:nLeft + 2, ;
                 PadC( "Não há dados disponíveis para exibição.", Int( oTbr:nRight - oTbr:nLeft ) - 2 ), "W+/RB" )
         ELSE
            DispOutAt( MaxRow(), 1, PadR( " Registro " + Ltrim( Str( oRs:AbsolutePosition ) ) + " de " + Ltrim( Str( oRs:recordCount ) ) + " ", 20 ), "N/W" )
         ENDIF

         DO WHILE .T.

            DispBegin()

            oTbr:forceStable()

            // Paint TBrowse current line...
            oTbr:ColorRect( { oTbr:RowPos, oTbr:LeftVisible, oTbr:RowPos, oTbr:RightVisible }, { 2, 1 } )
            // ... and current cell in different colors
            oTbr:ColorRect( { oTbr:rowPos, oTbr:colPos, oTbr:rowPos, oTbr:colPos }, { 3, 2 } )

            oTbr:refreshCurrent()

            DispEnd()

            IF ( oRs:eof() )
               DispOutAt( Int( ( oTbr:nBottom - oTbr:nTop ) / 2 ), oTbr:nLeft + 2, ;
                    PadC( "Não há dados disponíveis para exibição.", Int( oTbr:nRight - oTbr:nLeft ) - 2 ), "W+/RB" )
            ELSE
               DispOutAt( MaxRow(), 1, PadR( " Registro " + Ltrim( Str( oRs:AbsolutePosition ) ) + " de " + Ltrim( Str( oRs:recordCount ) ) + " ", 20 ), "N/W" )
            ENDIF

            nKey := Inkey(0)

            IF oTbr:applyKey( nKey ) == TBR_EXIT
               EXIT
            //ELSEIF nKey == K_ENTER
            //   nRecno := oRs:bookMark
            //   DispRow( oRs:getRows( 1, adBookmarkCurrent ) )
            //   oRs:bookMark := nRecno
            ENDIF

         ENDDO

      ENDIF
   RECOVER USING oErr
      HB_Alert( { "Ocorreu o erro : ;" + oErr:Description, "", "Operação: " + oErr:Operation }, ;
               { ' Fechar ' },"W+/B", 15 )
   ALWAYS

      IF oRs != NIL .And. oRs:state() = adStateOpen
         oRs:close()
      ENDIF

      IF oCn != NIL .And. oCn:state() = adStateOpen
         oCn:close()
      ENDIF

      oCn := NIL
      oRs := NIL
      SetCursor( nOldCursor )
   END SEQUENC
   
   CLS

   ErrorBlock( cbErr )
   
RETURN NIL
//------------------------------------------------------------------------------

FUNCTION ADORecordSetFieldBlock( oRs, i, xVal )

   /*
      RETURN { || If( oRs:eof(),Space(Max(oRs:Fields(i):DefinedSize,Len(oRs:Fields(i):name))),  ;
      oRs:fields(i):Value() ) }
   */        
   LOCAL bRet

   IF xVal == NIL
      If oRs:eof()
         bRet := { || Space( Max( oRs:Fields( i ):DefinedSize , Len( oRs:Fields( i ):name ) ) ) }
      Else
         bRet := { || oRs:Fields( i ):value }
      Endif   
   Else 
      bRet := { |xVal| oRs:Fields( i ):Value := xVal }
   ENDIF

   RETURN bRet
//------------------------------------------------------------------------------
STATIC FUNCTION  ADORecordSetSkipper(oRecordSet,nSkip)

   LOCAL nRec := oRecordSet:AbsolutePosition

   IF ! ( oRecordSet:eof )
      oRecordSet:Move( nSkip )

      IF oRecordSet:eof
         oRecordSet:moveLast()
      ENDIF

      IF oRecordSet:bof
         oRecordSet:moveFirst()
      ENDIF
   ENDIF

RETURN (oRecordSet:AbsolutePosition - nRec)
//------------------------------------------------------------------------------   

Nota: Caso necessite carregar o Record set para um array, use o método getRows() do ADO. Exemplo:

Código: Selecionar todos

LOCAL aArray, oRs, etc...
   // ...
   // Recuperação das kinhas do banco
   // ...
   
   aArray := oRs:getRows()
SQLMix ADO TBrowse
Anexos
Ado.ch
Arquivo de cabeçalho Ado.ch
(14.89 KiB) Baixado 513 vezes
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Minigui + SQL SERVER 2012

Mensagem por JoséQuintas »

luiz antonio da silva escreveu:Alguém teria um exemplo de conexão com MSSQL...
atualmente com MINIGUI EXT + ADODB + ORACLE 11g...
Pode ser que seja a string de conexão
Não o que significa exatamente ADODB.

Mas basta procurar no google "connection strings" e vai ter site que contém string pra tudo.

https://www.google.com.br/search?q=conn ... gs&ie=&oe=
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Ajuda com Minigui + SQL SERVER 2012

Mensagem por alxsts »

Olá!

Creio que o Luiz Antonio tenha resolvido o problema dele há quatro anos.
mmatos566 escreveu:COMO PEGAR OS DADOS DESTE SELECT
O (Retorno) NAO SEI COMO LER OS DADOS DESTE OETO
O problema atual é este acima.

Um fragmento de código que exemplifica como percorrer todo o record set:

Código: Selecionar todos

oCn := win_OleCreateObject("ADODB.Connection")

// Oracle XE
//oCn:ConnectionString := "Provider=OraOLEDB.Oracle;Data Source=XE;User ID=system;Password=abc100;FetchSize=100;CacheType=Memory;"

// SQL Server 2008 R2
oCn:ConnectionString := "Provider=SQLNCLI10;Server=999.16.40.5;Database=Harbour;Uid=usuario;Pwd=senha;"

oCn:Open()

If ! (oCn:state = adStateOpen)
   Break( Throw( ErrorNew() ) )
Endif

oRs := win_OleCreateObject( "ADODB.RecordSet")

cSql := "SELECT idOrder, Convert(Char(10), dtOrder,103) dtOrder, vlTotalOrder / 100 vlTotalOrder "
cSql += "  FROM dbo.tbOrder (NOLOCK) "
cSql += " WHERE Convert(Char(10), dtOrder,103) = '27/03/2013'"

With Object oRs

   :cursorType := adOpenStatic //adOpenForwardOnly  //adOpenForward //adOpenDynamic adOpenStatic //
   :activeConnection( oCn )
   :cursorLocation = adUseClient //adUseServer
   :maxRecords = 100000
   :cacheSize = 100
   :source := cSql

   :open()

   :moveFirst()

   While ! :eof()
      QOut( :Fields( "idOrder" ):value, "-", ;
            :Fields( "dtOrder" ):Value, "-", ;
            Transform( :Fields( "vlTotalOrder" ):Value, "@E 999,999.99" ) )

      :MoveNext()
   Enddo

   ? LTrim( Str( oRs:recordCount ), " Records"
End With

IF oRs != NIL .And. oRs:state() = adStateOpen
   oRs:close()
ENDIF

IF oCn != NIL .And. oCn:state() = adStateOpen
   oCn:close()
ENDIF

oCn := NIL
oRs := NIL
JoséQuintas escreveu: e vai ter site que contém string pra tudo.
Foi o que coloquei comentado no fonte do tópico acima.
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Minigui + SQL SERVER 2012

Mensagem por JoséQuintas »

Realmente.
Fui voltando mensagens, e a partir de alguma deixei de olhar o ano.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Minigui + SQL SERVER 2012

Mensagem por JoséQuintas »

Coisa esquisita.

Código: Selecionar todos

#include "inkey.ch"

PROCEDURE PTESADOBROW

   LOCAL oBrowse, oColumn, nCont, nKey
   LOCAL cnMySql := ADOClass():New( AppConexao() )

   CLS

   cnMySql:cSql := "SELECT * FROM JPANPAGE"
   cnMySql:Execute()

   oBrowse := TBrowseDb():New( 2, 2, MaxRow() - 2, MaxCol() - 2 )
   oBrowse:HeadSep    := Chr(196)
   oBrowse:ColSep     := Chr(179)
   oBrowse:FrameColor := "3/1"

   oBrowse:GoTopBlock    := { || cnMySql:Rs:MoveFirst() }
   oBrowse:GoBottomBlock := { || cnMySql:Rs:MoveLast() }
   oBrowse:SkipBlock     := { | n | ADOSkipper( cnMySql:Rs, n ) }
   FOR nCont = 0 TO cnMySql:Rs:Fields():Count() - 1
      oColumn := TBColumnNew( cnMySql:Rs:Fields( nCont ):Name(), RsBlock( cnMySql:Rs, nCont ) )
      oColumn:Width := Max( Min( cnMySql:Rs:Fields( nCont ):DefinedSize, 50 ), Len( cnMySql:Rs:Fields( nCont ):Name() ) )
      oBrowse:AddColumn( oColumn )
   NEXT

   DO WHILE .T.
      oBrowse:RefreshCurrent()
      nKey := 0
      DO WHILE nKey == 0 .AND. ! oBrowse:Stable
         oBrowse:Stabilize()
         nKey := Inkey()
      ENDDO
      IF nKey == 0
         oBrowse:RefreshCurrent()
         DO WHILE ! oBrowse:Stabilize()
         ENDDO
         nKey := Inkey(0)
      ENDIF
      DO CASE
      CASE nKey == K_UP;   oBrowse:Up()
      CASE nKey == K_DOWN; oBrowse:Down()
      CASE nKey == K_PGUP; oBrowse:PageUp()
      CASE nKey == K_PGDN; oBrowse:PageDown()
      CASE nKey == K_HOME; oBrowse:GoTop()
      CASE nKey == K_END;  oBrowse:GoBottom()
      CASE nKey == K_ESC;  EXIT
      ENDCASE
   ENDDO
   cnMySql:Close()

   RETURN

FUNCTION RsBlock( Rs, nCont )

   RETURN { || Rs:Fields( nCont ):Value }

FUNCTION ADOSkipper( Rs, nSkip )

   LOCAL nRec := Rs:AbsolutePosition

   IF ! Rs:Eof()
      Rs:Move( nSkip )
      IF Rs:Eof()
         Rs:MoveLast()
      ENDIF
      IF Rs:Bof()
         Rs:MoveFirst()
      ENDIF
   ENDIF

   RETURN Rs:AbsolutePosition - nRec
testeado.png
O primeiro campo é incremental, chave primária, começa no 1 e vai em frente.
No browse mostra número até repetido, o que não existe na tabela.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Minigui + SQL SERVER 2012

Mensagem por JoséQuintas »

adobrow.png
Assim mostrou direito.
Ao que parece, no primeiro fonte mostrou cortado, talvez definir tamanho maior.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Minigui + SQL SERVER 2012

Mensagem por JoséQuintas »

hazael escreveu:Esse é o problema com tbrowse que define o tamanho de todos baseado no primeiro a menos que você defina isso manualmente mas daí tem que saber previamente, não funciona de modo automático
Ao enviar minha resposta, entrou a sua primeiro, mas não se trata apenas disso, não é um problema só do tbrowse.
JoséQuintas escreveu:Ao que parece, no primeiro fonte mostrou cortado, talvez definir tamanho maior.
Pequena correção:
Na prática, melhor definir Picture e/ou outra alternativa que deixe tamanho fixo e sem dúvida sobre qual vai ser o conteúdo mostrado.

Porque o modo automático não dá certo:

Se um campo numérico de 4 dígitos vém do DBF, ele continua com 4 dígitos, compatível com Clipper

Se um campo numérico vém de outro lugar... é tratado como 10 posições (não sei ao certo o tamanho).
Ao deixar a coluna com o tamanho definido na estrutura, 4 posições por exemplo, não cabe o número.

Nem se trata de pegar o tamanho correto, mas de diferença no tratamento de números por parte do Harbour/Clipper.

Esse mesmo problema ocorre com quem está acostumado a não definir tamanho pra números.
Por exemplo: index on Str( numero )
O resultado vai ser diferente, dependendo de onde veio esse número.

Então... não é um problema do ADO/SQL, é um comportamento esperado do Harbour.

Certo? errado?
Str( variável ) retornar tamanho diferente, conforme a origem do número, é errado?
Tá assim há mais de 30 anos e ninguém nunca reclamou, ou talvez nunca percebeu.

Sair do mundo xbase é interessante.... tem que trabalhar igual a qualquer programador de qualquer linguagem de programação...
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Minigui + SQL SERVER 2012

Mensagem por JoséQuintas »

No meu estilo, pra minha classe de ADO, mas como é parecida com o recordset, tá fácil ajustar pro ADO comum.
Ainda em desenvolvimento, é praticamente a rotina anterior com modificação.

O uso prático
ADO1.png
A montagem genérica
ADO2.png
A navegação tradicional
ADO3.png
O posicionamento conforme digita - em fase de teste, inclusive NÃO genérico ainda.
ADO4.png
E a movimentação, igual já postaram
ADO5.png
Testei usar :Filter() e :Sort(), mas eles criam um segundo recordset.
O :Filter acaba sendo desvantagem, porque uma vez aplicado o filtro, não tem como retornar ao conteúdo anterior.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Minigui + SQL SERVER 2012

Mensagem por JoséQuintas »

Só pra curiosidade:
Minha classe tem a variável com o recordset.
ADO6.png
Em boa parte dos casos, trata-se apenas de repasse para o recordset, com validações extras.
Por exemplo, o Eof() acaba funcionando até mesmo se o recordset não tiver conteúdo "usável".
Acabo tendo as vantagens do ADO, mas eliminando algumas diferenças do que estamos acostumados.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Minigui + SQL SERVER 2012

Mensagem por JoséQuintas »

JoséQuintas escreveu:Testei usar :Filter() e :Sort(), mas eles criam um segundo recordset.
O :Filter acaba sendo desvantagem, porque uma vez aplicado o filtro, não tem como retornar ao conteúdo anterior.
O manual que olhei na primeira vez ensinava errado.
O filter está funcionando muito bem.

Isso e mais o ADS Local grátis.... talvez seja interessante até pra quem usa DBF !!!!
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Minigui + SQL SERVER 2012

Mensagem por JoséQuintas »

Aplicando filtro PET
Só que agora preso a minha classe de ADO, classe de janelas, GTWVG, etc.
ado.png
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com Minigui + SQL SERVER 2012

Mensagem por JoséQuintas »

Alexandre Santos

Agradeço muito o fonte que postou no ano passado.

Junto com minha classe, são o par perfeito !!!

DBF agora... acho que nem pra arquivo temporário....
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder