-
Posts
1,495 -
Joined
-
Last visited
-
Days Won
6
Everything posted by Geraldo (gbsilva)
-
Luiz você poderia tentar o seguinte, em vez de usar GROUP BY usar o DISTINCT porque voce não esta somando nada nos resultados e claro colocar a função max() no WHERE. Aliás no WHERE usei o BETWEEN acho mais prático. cSql := "SELECT DISTINCT concat(pe.fornecedor,'-',f.razao)," +; "date_format(pe.data,'%d/%m/%Y')," +; "pe.qtd," +; "pe.valor" +; " FROM pedido as pe" +; " INNER JOIN forne as f on pe.fornecedor = f.codigo" +; " WHERE pe.data BETWEEN "+Any2Sql(cGet[3]) AND "+Any2Sql(cGet[4])" +; " AND pe.produto ='"+cGet[1]+"'" +; " AND pe.tipo='2'" +; " ORDER BY pe.fornecedor," +; "pe.data asc ;" Sds,
-
Luiz não sei se resolveria, mas não poderia ser algo assim: if parametro = 1 objeto_focu = x elseif parametro = 2 objeto_focu = y elseif parametro = 3 objeto_focu = z etc... endif ACTIVATE DIALOG oDlg ON INIT objeto_focu:setfocus() Sds,
-
Luiz qual seria exatamente a ordem que você precisa, ordenar por código ascedente e dia e hora descendente ou voce quer apenas o último registro e desse registro a data mais antiga e hora também. Se for a segunda opção se voce fizer um select max(codigo), min(data), min(hora) não funcionaria? Sds,
-
ENCONTRO DE FIVEWINNERS - 16/11/2013 - Sábado.
Geraldo (gbsilva) replied to kapiaba's topic in Programação
Pessoal infelizmente se tudo der certo estarei de férias de 11 a 25/11/2013 e não poderei rever os amigos. Nos últimos anos sempre estive, mas estarei em Minas nesses dias, fica para próxima. Abraços a todos. -
TOleauto - Largura da coluna no excel
Geraldo (gbsilva) replied to Geraldo (gbsilva)'s topic in Programação
Pessoal acabei descobrindo uma dica antiga e lá tinha o que eu precisava, mas aproveitando será que alguém teria uma listagem completa dos métodos e atributos da TOleauto. Tem mais uma coisa que tenho de fazer no relatório do excel que é quebrar automaticamente para que o texto seja apresentado na coluna de modo a ser lido, hoje o usuário tem que configurar, mas sempre o ideal é deixar tudo pronto via programação. Abaixo o que encontrei nos meus arquivos pode ser útil para alguém: FUNCTION MAIN() LOCAL oExcel, oSheet oExcel := TOleAuto():New( "Excel.Application" ) oExcel:WorkBooks:Add() oSheet := oExcel:Get( "ActiveSheet" ) oSheet:Name := "Aba 1" oSheet:Cells( 1, 1 ):Value := "Codigo" oSheet:Cells( 1, 2 ):Value := "Nome" oExcel:Sheets:Add() oSheet := oExcel:Get( "ActiveSheet" ) oSheet:Name := "Aba 2" oSheet:Cells( 1, 1 ):Value := "Data" oSheet:Cells( 1, 2 ):Value := "Valor" oSheet:Cells( 1, 1 ):Select() oExcel:Visible := .T. Return Nil Preencher as células: Cells(linha,coluna):Value oSheet:Cells( 2, 1 ):Value := "NÃO" oSheet:Cells( 2, 2 ):Value := " N O M E D O P A I" oSheet:Cells( 2, 3 ):Value := " N O M E D O A L U N O" oSheet:Cells( 2, 4 ):Value := "Ano" oSheet:Cells( 2, 5 ):Value := "Mensalidade" oSheet:Cells( 2, 6 ):Value := "Apostila" oSheet:Cells( 2, 7 ):Value := "Xerox" oSheet:Cells( 2, 8 ):Value := "Uniforme" oSheet:Cells( 2, 9 ):Value := "R.O." oSheet:Cells( 2, 10 ):Value := "Total" Tamanho das colunas: oSheet:Columns(1):ColumnWidth := 3.86 oSheet:Columns(2):ColumnWidth := 40 oSheet:Columns(3):ColumnWidth := 40 oSheet:Columns(4):ColumnWidth := 7 oSheet:Columns(5):ColumnWidth := 6.43 Tamanho da letra e Negrito: oSheet:Cells( 1, 1 ):Font:Size := 14 oSheet:Cells( 1, 1 ):Font:Bold := .T. oSheet:Cells( 2, 1 ):Font:Size := 10 Alinhamento das células oSheet:Cells( 1, 1 ):HorizontalAlignment:= -4108 //Centro oSheet:Cells( 1, 2 ):HorizontalAlignment:= -4131 //Esquerda oSheet:Cells( 1, 3 ):HorizontalAlignment:= -4152 //Direita oSheet:Range("A2:M2"):HorizontalAlignment:= -4131 //Esquerda de A2 até M2 Mesclar células oSheet:Range("A1:M1"):Merge() Escolher fonte de letra: oSheet:Cells:Font:Name := "Times New Roman" oSheet:Cells:Font:Size := 9 Formatar célula: oSheet:Cells( 1, 5 ):Set( "NumberFormat", "#.##0,00" ) Cor da letra: oSheet:Cells( 1, 1 ):Font:ColorIndex := 3 Cor de Preenchimento: oSheet:Cells( 1, 2 ):Interior:ColorIndex := 7 Tabela de cores básicas: Preto = 1 Branco = 2 Azul = 5 Azul Claro = 41 Azul Escuro = 11 Verde = 10 Vermelho = 3 Amarelo = 6 Marron = 53 Violeta = 13 Laranja = 46 Rosa = 7 Colocar Bordas: oSheet:Range("A2:M10"):Borders(1):LineStyle:= 1 oSheet:Range("A2:M10"):Borders(2):LineStyle:= 1 oSheet:Range("A2:M10"):Borders(3):LineStyle:= 1 oSheet:Range("A2:M10"):Borders(4):LineStyle:= 1 -
Pessoal eu já uso a TOleauto e para definir as larguras das colunas utilizo AutoFit(), mas agora estou precisando definir uma largura diferente em umas colunas e não consegui achar uma solução pesquisando aqui. Agradeço se alguém puder ajudar. Sds,
-
Extrair linhas e espaços em branco de um texto.
Geraldo (gbsilva) replied to Geraldo (gbsilva)'s topic in Programação
Lembrei de mais um detalhe nesse campo já havia vários [enter] que consegui eliminar com replace no select, provavelmente terá também barra de espaço ou tab se tiver qual é o chr() dessas teclas, pode ser que necessite. REPLACE(a.aopt,char(13),'') AS s_aopt Grato, -
Extrair linhas e espaços em branco de um texto.
Geraldo (gbsilva) replied to Geraldo (gbsilva)'s topic in Programação
Pessoal obrigado pelas respostas. Postei uma imagem para voces entenderem melhor o problema. João só vou poder testar amanhã na empresa, mas será que mesmo sendo uma linha inteira como esta na imagem essa solução resolveria ou teria que ser outra. Sds, -
Pessoal estou com um problema, um campo text que importo do sqlserver vem como a imagem anexa e eu preciso eliminar essas linhas e espaços que o usuário coloca. se eu jogar isso numa variável texto como eu poderia tratar essa variável antes de gerar o relatório deixando apenas 1 espaço entre as frases. Grato,
-
Judson eu faria diferente, primeiro para pegar os dados de origem eu faria um select e depois usaria um USE SQL ou SqlArray, e faria toda a atualização dentro de uma única transação, pois no seu código voce abre e fecha uma transação a cada registro. Não sou nenhum expert em sql, mas pode ficar mais rápido. O exemplo de código não é o ideal eu atualmente crio uma classe para fazer algo assim, mas é apenas para dar uma idéia e principalmente eu usaria SqlArray, não gosto muito do USE SQL. local cSql,var1,var2 cSql := "SELECT campo1," +; "campo2" +; " FROM tabela" +; " WHERE ... " +; " ORDER BY campo1 ;" USE SQL (cSql) ALIAS tabela NEW Begin Transaction //-> inicia a transação WHILE !tabela->(Eof()) var1 := tabela->campo1 var2 := tabela->campo2 if !Inserir(var1,var2) //-> se der algum erro voce faz rollback endif tabela->(DbSkip() ) END tabela->(DbCloseArea() ) End Transaction //-> fecha a transação Function Inserir(var1,var2) //- aqui faria o insert na tabela de destino return(.t.)
-
SQLRDD - INSERT INTO - Vários registros de uma vez. Como?
Geraldo (gbsilva) replied to Ariston Santos's topic in Programação
Ariston fiz um pequena alteração e inseriu normalmente, testei usando o EMS, estava dando erro ai tirei a vírgula do campo valor e incluiu os 4 registros, lembrando que criei a tabela com os atributos codigo (char(2)), descricao (varchar(40)) e valor (double(10,2)). INSERT INTO teste (codigo,descricao,valor) VALUES ('1','Descrição do item 1', 4.00), ('2','Descrição do item 2', 3.00), ('3','Descrição do item 3', 2.00), ('4','Descrição do item 4', 1.00) ; commit; Sds, -
Pessoal sei que aqui já tem bastante dicas sobre sites desse tipo, mas esse é muito legal é site de busca, basta digitar o nome em inglês do que você quer. Após exibição da lista se você clicar no icone aparece os tamanhos disponíveis, existem alguns pagos, mas a maioria e grátis é só fazer o download e usar. https://www.iconfinder.com/
-
001 - Valdir - JundiaÃ/SP 002 - Ana - Cianorte/PR 003 - Cesar - Cianorte/PR 004 - EMotta Sistemas - Nova Odessa/SP 005 - EMotta Sistemas - Nova Odessa/SP 006 - EMotta Sistemas - Nova Odessa/SP 007 - EMotta Sistemas - Nova Odessa/SP 008 - EMotta Sistemas - Nova Odessa/SP 009 - Império 010 - Evandro - Curvelo/MG 011 - Dorneles 012 - Dorneles 013 - Kleyber Derick / MA 014 - Geraldo (gbsilva)
-
Grande amigo Valdir, pode contar com minha presença também.
-
Acrescentar METODO em uma Classe - Resolvido
Geraldo (gbsilva) replied to evertonlb's topic in Programação
Concordo com o Motta, o ideal é mesmo criar uma nova classe, assim voce pode criar novos ou modificar a ação de determinado método. Eu que entendo muito pouco consegui fazer uma nova classe herdando da classe database e fiz algumas modificações para atender algumas necessidades, na época com a ajuda de alguns amigos aqui do fórum. *===================================================================================* * Classe : TMyData * * Programador: Geraldo Barbosa da Silva * * Colaboração: * *===================================================================================* * Observação: Classe filha da classe Database do fivewin *===================================================================================* #include "FiveWin.ch" #include "dbinfo.ch" #include "dbstruct.ch" #include "tsbutton.ch" #include "xbrowse.ch" CLASS TMyData FROM TDataBase DATA aDados,aCadastro,aSaldo,aLista,aReturn,aReceber DATA lEdita,lAppend,password,lPassword,lReturn METHOD New() CONSTRUCTOR METHOD LoadArray(_oBrw,_nCampo) METHOD Carga(_oObjeto,_nObjeto,_oFoco) METHOD NewRecord(_oObjeto,_oCad,_nField,_nLenField,_oFoco) METHOD UpRecord(_oBrw,_oCad,_nLenField) METHOD Clean(_oObjeto,_nLenObjetos,_nInicial) #ifdef __HARBOUR__ METHOD Seek( uExp, lSoft, lWildSeek, lCurRec ) #else METHOD Seek( uExp, lSoft ) #endif ENDCLASS METHOD New() CLASS TMyData super:New() super:Open() ::aDados := {} //-> Matriz principal para carregar no browse ::aCadastro := {} //-> Usada para gerar browse para consultas ::aSaldo := {} //-> Usada para gerar browse para consultas ::aLista := {} //-> Usada para gerar browse para consultas/exclusões ::aReturn := {} //-> Usada para pegar daddos retornado de alguma consulta ::aReceber := {} //-> Usada para carregar contas a receber ::lEdita := .f. ::lAppend := .t. ::password := space(10) //-> verificar senha do usuário ::lPassword := .f. ::lReturn := .f. return self //-> Gera código para o próximo registro a ser gravado no banco METHOD NewRecord(_oObjeto,_oCad,_nField,_nLenField,_oFoco) CLASS TMyData local nNextReg:=0 nNextReg := ::RecCount() + 1 ::lEdita := .t. ::lAppend := .t. ::Blank() ::Clean(_oCad) ::aBuffer[_nField] := STRZERO(nNextReg,_nLenField) _oCad[_nField]:VarPut(::aBuffer[_nField]) _oCad[_nField]:refresh() GbFoco(_oFoco) return(.t.) //-> Atualiza dados na dialog de acordo com movimentação no browse METHOD UpRecord(_oBrw,_oCad,_nLenField) CLASS TMyData local nUp DEFAULT _nLenField := Len(::aBuffer) //-> se não existir nenhum cadastro retorna if Len(::aDados) = 0 return(.t.) endif For nUp = 1 to _nLenField _oCad[nUp]:VarPut(::aDados[_oBrw:nArrayAt,nUp]) _oCad[nUp]:refresh() Next ::lEdita := .f. return(.t.) //-> Carrega DBF no Browse, usado para trabalhar com array METHOD LoadArray(_oBrw,_nCampo,_lEmpty,_cFilter,_nColuna) CLASS TMyData local nP ,; nT ,; nReg:=0,; aTemp ,; nDel ,; nTot:=Len(::aDados) local cSelect := "" DEFAULT _nCampo := 1,; _lEmpty := .f. if nTot > 0 for nDel = 1 to nTot DelMatriz(::aDados) next endif nReg := ::RecCount() //-> verifica quantidade de registros no DBF ::Gotop() for nP = 1 to nReg //-> se existir filtro só os registros que atendem a condição são carregados if !empty(_cFilter) if ::aBuffer[_nColuna] <> _cFilter ::skip() //-> skip no DBF loop endif endif aTemp := {} //-> inicia array temporária //-> adiciona 1 registro a array temporária, independente do número de colunas if _lEmpty = .t. //-> Se for .t. inclui uma coluna vazia para usar flag no browse aAdd(aTemp,space(1) ) endif for nT = 1 to Len(::aBuffer) aAdd(aTemp,::aBuffer[nT] ) next //-> adiciona registro da array aTemp para array ::aDados se o campo (padrão _nCampo = 1) não for vazio if !empty(aTemp[_nCampo]) aAdd(::aDados, aTemp ) endif nT := 1 //-> iguala variável do segundo for ::skip() //-> skip no DBF next return(.t.) //-> Carrega na Tela dados do registro METHOD Carga(_oObjeto,_nObjeto,_oFoco) CLASS TMyData local nBuffer DEFAULT _nObjeto := Len(::aBuffer) if ::lBuffer For nBuffer = 1 to _nObjeto _oObjeto[nBuffer]:VarPut(::aBuffer[nBuffer]) _oObjeto[nBuffer]:refresh() Next if !empty(_oFoco) GbFoco(_oFoco) endif endif return(.t.) //-> Limpa get´s METHOD Clean(_oObjeto,_nLenObjetos,_nInicial) CLASS TMyData local nT DEFAULT _nInicial := 1 ,; _nLenObjetos := Len(::aBuffer) ::Blank() for nT = _nInicial to _nLenObjetos _oObjeto[nT]:refresh() next return(.t.) //-> Método Seek Modificado do Original (tirado ::Load() ) #ifdef __HARBOUR__ METHOD Seek( uExpr, lSoft, lWildSeek, lCurRec ) CLASS TMyData #else METHOD Seek( uExpr, lSoft ) CLASS TMyData #endif local lFound DEFAULT lSoft := Set( _SET_SOFTSEEK ) #ifdef __HARBOUR__ If Upper( Left( ( ::nArea )->( OrdKey() ), 5 ) ) == 'UPPER' uExpr := Upper( uExpr ) endif DEFAULT lCurRec := .f. if lWildSeek == .t. .and. ValType( uExpr ) == 'C' lFound = ( ::nArea )->( OrdWildSeek( uExpr, lCurRec ) ) else lFound = ( ::nArea )->( DbSeek( uExpr, lSoft ) ) endif #else lFound = ( ::nArea )->( DbSeek( uExpr, lSoft ) ) #endif //-> Modificado da classe original Fwh1111 31/12/2011 // if ::lBuffer .and. ! ( ::nArea )->( Eof() ) // ::Load() // endif return lFound //-> Idem ao original apenas usando o método sem o _Delete() para Delete() METHOD Delete() CLASS TMyData local lLocked := .f. local lDeleted := .f. if ! ::Eof() .and. ! ::lReadOnly .and. ! ( ::nArea )->( Deleted() ) if ::lShared if ::IsRecLocked( ::RecNo() ) .or. ( lLocked := ::RecLock( ::RecNo() ) ) ( ::nArea )->( DbDelete() ) lDeleted := .t. if lLocked ::Commit() ::RecUnLock( ::RecNo() ) endif else MsgAlert( "DataBase in use", "Please try again" ) endif else ( ::nArea )->( DbDelete() ) lDeleted := .t. endif if lDeleted if Set( _SET_DELETED ) // .or. ! Empty( ( ::nArea )->( DbFilter() ) ) ::Skip( 1 ) if ::Eof() ::GoBottom() endif endif endif endif return lDeleted -
Barra de rolagem vertical(Resolvido)
Geraldo (gbsilva) replied to Arthur Silvestre's topic in Programação
Verifiquei no meu five e minha classe também é default é .f. // DATA lVThumbTrack AS LOGICAL INIT .f. // When .t., thumbtrack scrolls the browse. (not suited for slow data access). Tradução do google: Quando. T., Thumbtrack rola a navegação. (não é adequado para o acesso de dados é lenta. -
Desculpem teclei enter sem querer, faltou a pergunta: essa função funciona com recursos também? Grande Valdir como vai? Grato a todos.
-
Wagner, João tudo bem com os senhores.
-
Eu tive um problema desse e o problema era no servidor, usávamos em um servidor o cara do TI resolver que iria colocar num servidor onde todos tem acessos e criam suas pastas, ai começou essa história de não gravar e outra estação só enxergava se saisse do sistema e entrasse novamente. Não sei explicar o que esse servidor tem além do que mencionei acima e no que funcionava só tinha o windows e o mysql instalado. Se tivesse que apostar, apostaria que é no servidor o problema, não seria possÃvel pegar uma máquina qualquer e instalar o mysql e fazer um teste.
-
Olá uso essa função criada criada por uma turma dos feras do nosso fórum e funciona muito bem. Fiz algumas alterações para atender minha necessidade, mas esta documentado. Abaixo um exemplo de utilização: local i,nDados,cArquivo cArquivo:= cGetFile32("*.XLS","Escolha o arquivo") IF !File(cArquivo) RETURN ENDIF lNewFile := cArquivo //-> Aqui leio os dados da planilha LeExcel( lNewFile,@aDados, 24, {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24},1,2,,.f. ) nDados:=Len(aDados) For i = 1 to nDados ... trato as colunas retornadas e exemplo de tratamento codigo := aDados[i,1] ... chamo função para gravar Next ////////////////////////////DADOS DA FUNCAO//////////////////////////////////////////// // NOME : LeExcel // // AUTOR : Evandro G. de Paula // // COLABORAÇÃO: Gilmer Tavares (toda a parte OLE) // // SINTESE : Ler arquivo xml // // PARAMETROS : <1> cNome do arquivo xml // // <2> Matriz a ser carregado os dados // <3> nTotal de colunas a ler (coluna limite a ser lida) // // <4> aVetor com os números da coluna a serem efetivamente lidas // // <5> nColuna verificação do conteúdo obrigatório. Caso a célula esteja// // vazia, toda a linha será ignorada. (default=aVetor[1]) // // <6> Linha inicial na planilha a ser lida (padrão 1) // <7> Vetor para pegar dados no cabeçalho da planilha lida // <8> Array com as posições a serem lidas na planilhas <linha,coluna> // <9> .f. padrão lê apenas primeira aba, se for .t. lê todas // RETORNO : aVetor com os dados da planilha // /////////////////////////////////////////////////////////////////////////////////////// /* Chamada LeExcel(Vide Abaixo) #include "FiveWin.ch" Function Main() LeExcel( 'original', 4, {1,2,3,4},1 ) //-> Uma chamada mais incrementada LeExcel( lNewFile,@aDados, 21, {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21},1,2,,.f. ) return nil */ Function LeExcel(cXlsArquivo,aVetor,nColunas,aColunas,nColObrig,nLinhaInicial,aTitulos,aColAd,cSheets) Local oDlg,oExcel,oFolha,nLinhas Local cProject, cFile, cRota:=cFILEPATH(GETMODULEFILENAME(GETINSTANCE())) // Tirei as 02 linhas abaixo pois não tem necessidade //cXlsArquivo+='.xls' //cXlsArquivo:=strtran( cXlsArquivo, '.xls.xls','.xls' ) if !file( cXlsArquivo ) msgalert( 'Arquivo '+cXlsArquivo+' não encontrado.', 'Verifique' ) else oExcel := TOleAuto():New( "Excel.Application" ) //oExcel:Workbooks:Open(cRota+cXlsArquivo) oExcel:Workbooks:Open(cXlsArquivo) oFolha := oExcel:Get( "ActiveSheet" ) oWork := oExcel:Get( "ActiveWorkbook" ) oWork:Saved:=.t. nLinhas:=oFolha:UsedRange:Rows:Count() oExcel:Workbooks:Close() oExcel:Quit() LeArqExcel( cXlsArquivo,nColunas, aColunas,@aVetor, nColObrig,nLinhaInicial,aTitulos,aColAd,cSheets ) endif return aVetor Function LeArqExcel( cXlsArquivo, nColunas, aColunas, aVetor, nColObrig, nLinhaInicial,aTitulos,aColAd,cSheets ) Local aLinha Local cNome, cMatricula, cChave, cLinha Local nLinhas, x, x1, nPos Local oExcel, oFolha, oWork Local xLinha,nCol:=1,nDados:=0,nH,nSheets:=0,nF Local nT,nP,nColAd,lColAd,nContaAba:=1 //-> geraldo DEFAULT nColObrig:=aColunas[1] DEFAULT nLinhaInicial := 1 DEFAULT cSheets := .f. oExcel := TOleAuto():New( "Excel.Application" ) oExcel:Workbooks:Open(cXlsArquivo) //-> Verifica abas nSheets := oExcel:Sheets:Count() //-> Verifica se vai ler cabeçalho apenas da primeira planilha if cSheets = .f. nLerAba := 1 else nLerAba := nSheets endif For nF := 1 to nSheets oExcel:Worksheets( nF ):Select() oFolha := oExcel:Get( "ActiveSheet" ) oWork := oExcel:Get( "ActiveWorkbook" ) oWork:Saved:=.t. ************************************************************************** //-> Inclui essas linha para pegar cabeçalho (Geraldo 10/11/2009) If nContaAba <= nLerAba if !empty(aColAd) nColAd := Len(aColAd) For nT = 1 to nColAd aAdd( aTitulos, {oFolha:Cells( aColAd[nT,1],aColAd[nT,2] ):Value } ) Next /* Como pegar os dados do cabeçalho For nP = 1 to Len(aTitulos) ? aTitulos[nP,1] Next */ endif nContaAba++ endif ************************************************************************** nLinhas=oFolha:UsedRange:Rows:Count() For x:= nLinhaInicial to nLinhas xLinha:=oFolha:Cells( x, nColObrig ):Value if nColObrig > 0 .and. xLinha == nil loop endif aLinha:={} For x1 = 1 to nColunas if ascan( aColunas, x1 )>0 aadd( aLinha, oFolha:Cells( x, x1 ):Value ) endif Next x1 aAdd( aVetor, aLinha ) Next x Next oExcel:Workbooks:Close() oExcel:Quit() return aVetor Sds,
-
Acho que voce não faz um WHERE e sim o AND é porque são 2 condições, desculpe. Outra sugestão a tabela detalhes é quem deve ficar a esquerda do LEFT JOIN tente inverter como abaixo. cComm := "select A.NOMECLI, B.IDEXAME, B.NOMEEXA, B.QTDEXAME, B.VLEXAME FROM AMOSTRAS_DET B " cComm += "LEFT JOIN AMOSTRAS_CAB A ON B.IDAMOSTRA = A.IDAMOSTRA " cComm += "AND A.IDAMOSTRA = "+SR_cDBValue( nIDAMOSTRA )
-
Se ta errado não sei, no mÃnimo estranho. cComm := "select A.NOMECLI, B.IDEXAME, B.NOMEEXA, B.QTDEXAME, B.VLEXAME FROM AMOSTRAS_CAB A " cComm += "LEFT JOIN AMOSTRAS_DET B ON B.IDAMOSTRA = A.IDAMOSTRA " cComm += "AND A.IDAMOSTRA = "+SR_cDBValue( nIDAMOSTRA ) // não faltou ou WHERE e não AND nessa linha ????? cComm += " WHERE A.IDAMOSTRA = "+SR_cDBValue( nIDAMOSTRA )
-
Oi Alexandre tudo bem! Aproveitando esse tópico, voce cita o php, posso saber o que usar para fazer as telas em PHP, Pelles não funciona certo. Já vi o Flex, mas esse é muito complicado. Sds,
-
Sérgio funcionou sim, para falar a verdade ainda não havia utilizado SAY nativo. Muito obrigado.
-
Pessoal em meus dialog quando posiciono os textos a direita fica ok, mas se usar o for abaixo para colorir a tela o texto fica a esquerda, alguém sabe como resolver isso. Estou usando a ssay. For IdCor = 501 to 504 REDEFINE SENSITIVE SAY ID IdCor COLOR CLR_BLACK OF oDlg FONT nFont Next IdCor Nas imagens anexas dá para ver, se tiro as linhas acima fica a direita, mas não posso usar COLOR na Dialog. Grato,