Clipper On Line • Ver Tópico - Ajuda com Minigui + SQL SERVER 2012

Ajuda com Minigui + SQL SERVER 2012

Projeto MiniGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

 

Ajuda com Minigui + SQL SERVER 2012

Mensagempor luiz antonio da silva » 07 Ago 2014 22:21

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
Data de registro: 21 Nov 2006 21:12
Cidade/Estado: serrana-sp
Curtiu: 13 vezes
Mens.Curtidas: 10 vezes

Ajuda com Minigui + SQL SERVER 2012

Mensagempor luiz antonio da silva » 08 Ago 2014 22:31

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
*
* 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
#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/details.aspx?id=36434

e é isso...blz?

Luiz.
HMG 3.4.4 - SQL SERVER - ORACLE
luiz antonio da silva
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 161
Data de registro: 21 Nov 2006 21:12
Cidade/Estado: serrana-sp
Curtiu: 13 vezes
Mens.Curtidas: 10 vezes

Ajuda com Minigui + SQL SERVER 2012

Mensagempor mmatos566 » 03 Out 2018 16:53

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
mmatos566
Usuário Nível 1

Usuário Nível 1
 
Mensagens: 1
Data de registro: 27 Set 2018 16:36
Cidade/Estado: Santarém
Curtiu: 0 vez
Mens.Curtidas: 0 vez

Ajuda com Minigui + SQL SERVER 2012

Mensagempor alxsts » 03 Out 2018 20:48

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.
/*
        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:

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 292 vezes
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Ajuda com Minigui + SQL SERVER 2012

Mensagempor JoséQuintas » 03 Out 2018 21:33

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=connection+strings&ie=&oe=
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Ajuda com Minigui + SQL SERVER 2012

Mensagempor alxsts » 03 Out 2018 22:29

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:
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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Ajuda com Minigui + SQL SERVER 2012

Mensagempor JoséQuintas » 04 Out 2018 00:19

Realmente.
Fui voltando mensagens, e a partir de alguma deixei de olhar o ano.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Ajuda com Minigui + SQL SERVER 2012

Mensagempor JoséQuintas » 14 Out 2019 21:42

Coisa esquisita.

#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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Ajuda com Minigui + SQL SERVER 2012

Mensagempor JoséQuintas » 15 Out 2019 00:29

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Ajuda com Minigui + SQL SERVER 2012

Mensagempor JoséQuintas » 15 Out 2019 11:00

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Ajuda com Minigui + SQL SERVER 2012

Mensagempor JoséQuintas » 09 Nov 2019 04:09

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Ajuda com Minigui + SQL SERVER 2012

Mensagempor JoséQuintas » 09 Nov 2019 04:24

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Ajuda com Minigui + SQL SERVER 2012

Mensagempor JoséQuintas » 10 Nov 2019 13:04

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Ajuda com Minigui + SQL SERVER 2012

Mensagempor JoséQuintas » 10 Nov 2019 14:13

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Ajuda com Minigui + SQL SERVER 2012

Mensagempor JoséQuintas » 12 Nov 2019 16:26

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Próximo



Retornar para MiniGui

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 3 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro