
Micheus
Veteranos-
Total de itens
3.189 -
Registro em
-
Última visita
Tudo que Micheus postou
-
é uma opção. Particularmente, eu prefiro o acesso nativo - sem uso de bibliotecas intermediárias como driver ODBC ou OLEDB. Aqui no forum você acha algumas pistas. Veja este tópico: Autenticar usuário cadastrado em site, Acessar o banco de dados MySQL do site
-
DiabloX3, eu sugeriria que você usasse os componentes da palega ZeosLib (freeware) que dá suporte tanto ao Firebird quanto ao MySQL. Se não me engano, há tópicos aqui sobre conexão MySQL remoto, inclusive usando Zeos. Voce pretende também trazer a estrutura do banco de dados remoto para a criação local ou você já a terá localmente? Há diferenças entre algumas instruções SQL dos dois bancos.
-
dan_visualdm, sobre este erro, poderia dizer algo similar ao que disse antes e você respondeu com Qual é mesmo o nome do seu campo que guarda a imagem? Lá no post #2 eu já dizia: não sei porque você voltou a usar aquele nome de campo, quando posteriormente você disse que ele chamava-se apenas Imagem como nos posts recentes, quando você usou: ADOQuery1.Fields.FieldByName('Imagem').AsString Eu apenas tento ajudar em questões da logica e comandos, mas não posso garantir detalhes como nome de componentes e campos os quais não tenho em minhas mãos (só você sabe o que está fazendo - eu trabalho com o que você posta aqui). ;) Este é mesmo apenas um aviso. Ele é mostrado porque, se você observar bem, há uma condição para que a variável seja inicializada que é quando a resposta é sim. Ela é apenas um alerta, cabendo apenas a verificação e correção caso seja necessário. Neste caso, bastaria que você acrescentar a atribuição à variável no else do if (o qual não usei no exemplo). O fato de eu não ter feito a inicialização nesta condição deve-se ao fato de que não existindo a imagem, pouco importa o valor da variável, se verdadeira ou falsa, a imagem deverá ser gravada de qualquer forma! Abraços
-
O erro é porque a função espera um PAnsiChar como parâmetro, então, definimos duas variáveis do tipo ponteiro para caracter e movemos a string para ela usando a função StrPCopy (se não troquei o nome): var Origem, // <== **** Destino :array[0..512] of Char; // <== **** Sobrescreve :Boolean; Diretorio : String; begin if OpenPictureDialog1.Execute then begin Diretorio := 'C:\teste\imagens\'+ ExtractFileName(OpenPictureDialog1.FileName); if FileExists(Diretorio) then Sobrescreve := MessageDlg('O arquivo já existe no destino. Deseja sobrescrevê-lo?', mtConfirmation, [mbOk, mbYes], 0) = mrYes; StrPCopy(Origem, OpenPictureDialog1.FileName); // <== **** StrPCopy(Destino, Diretorio); // <== **** CopyFile(Origem, Destino, Sobrescreve); f_incluir_imoveis.Image1.Picture.LoadFromFile(Diretorio); dm.t_fotos.Edit; dm.t_fotosCaminhoImg.AsString := Diretorio; // < === *** supondo nome campo CaminhoImg dm.t_fotos.Post; end; end Vixe!!! Eu errei e você ainda não aprendeu o que já falamos no início - post#4 (veja o post).Lembra que por lá já falei que podemos acessar o campo de diferentes modos - mas não da forma como está: tbl_imagem.Fields.FieldByName('CaminhoImg').AsString tbl_imagemCaminhoImg.AsString Abraços
-
Eder, ainda é aquele processo de instalação no Vista? A conta de usuário que você está usando para instalar o componente por acaso não é do grupo Administrador? Se não é, você verificou as permissões de usuário na chave HKEY_CURRENT_USER\Software\Borland\ (da qual o Jhonas falou)?
-
Preview com mais de uma página, apresenta um erro ?
pergunta respondeu ao António44 de Micheus em Delphi, Kylix
António44, vou postar a nova sugestão aqui, mas lembro que este problema diz respeito ao seu outro tópico: Preview com mais de uma página, apresenta um erro ?. A função abaixo, tem como objetivo, retornar o caminho completo, já com as variáveis de ambientes devidamente substituidas, no parâmetro path: function ConvertEnvironmentName(Path :string) :string; const VarName :array[1..3] of string = ('WINDIR', 'SYSTEMROOT', 'USERPROFILE'); var Idx, IdxVar :Integer; VarPath :array[0..MAX_PATH] of char; begin Path := UpperCase(Path); for Idx := 1 to 3 do begin IdxVar := Pos('%'+VarName[Idx]+'%', Path); if IdxVar > 0 then begin GetEnvironmentVariable(PChar(VarName[Idx]+#0), VarPath, MAX_PATH); Delete(Path, IdxVar, Length(VarName[Idx])+2); Insert(StrPas(VarPath), Path, IdxVar); Break; end; end; Result := Path; end; Até aqui ainda estaremos trabalhando com long path. Observar que em Path, o nome das variáveis vem delimitados pelo caracter "%", os quais são concatenados na função Pos para permitir sua correta localização e substituição. As funções SetGlobalEnvironment e GetGlobalEnvironment continuam as mesmas; Apenas iremos alterar o evento OnCreate do seu form principal para fazer uso da nova função. Já o evento OnDestroy, talvez seja melhor manter para que quando sua aplicação fechar as coisas fiquem como estavam antes de seu início. procedure TForm1.FormCreate(Sender: TObject); var TMP :String; LongPath :array[0..512] of char; ShortPath :array[0..MAX_PATH] of char; begin TMPOld := GetGlobalEnvironment('TMP', False); // Salva o valor de TMP antes da alteração StrPCopy(LongPath, ConvertEnvironmentName(TMPOld)); // Preenche LongPath com o caminho completo if LongPath <> '' then if GetShortPathName(LongPath, ShortPath, MAX_PATH) <> 0 then // obtém path no formato curto - short path begin if not SetGlobalEnvironment('TMP', ShortPath, True) then // altera path na variável TMP para o formato curto ShowMessage('Erro ao tentar mudar a variável de ambiente "TMP"'); end else ShowMessage('Erro ao obter o path curto.'); end; procedure TBrwChaves.FormDestroy(Sender: TObject); begin SetGlobalEnvironment('TMP', TMPOld, True); end; Abraços -
Preview com mais de uma página, apresenta um erro ?
pergunta respondeu ao António44 de Micheus em Delphi, Kylix
António44, é possível resolver o problema sem mudar o caminho original. O que dá para fazer é transformar o long path em short path. Eu tenho um código que desses e que verifica a questão da variável %USERPROFILE% (que percebi quando comecei a usar o meu antigo programa no XP), só que está na empresa em que travalho, então eu posto no domingo - caso alguém não lhe tenha respondido. Abraços -
DiabloX3, aqui parece mesmo a forma como foi implementado o método print do componente. O fato de ele não "voltar" e continuar para a próxima linha (que seria o esperado), sugere que ele possa está usando o comando Abort (não posso afirmar 100%). Se você tiver os fontes do componente, talvez você possa verificar isto. Para tirar a dúvida, você poderia acrescentar esta parte no código e verificar. Se for isto mesmo, você terá como saber que houve o cancelamento da impressão: ... frmRelVendas1.frRelUm.Prepare; try frmRelVendas1.frRelUm.Print; except ShowMessage('Abortou'); end; frmFinalizaVenda.Close; supondo que a mensagem apareça, então você confirmou o que penso e então você deve preparar seu código para o caso de a impressão ter ou não sido feita. Caso ela não seja, o seu processo de finalização da venda fica cancelado? Voce tem que verificar isto. Deve haver um motivo para você querer fechar a consulta só após a impressão. Mas se não houver problema, então simplesmente feche a consulta e depois chame o print. ... frmFinalizaVenda.Close; frmRelVendas1.frRelUm.Prepare; frmRelVendas1.frRelUm.Print; Abraços
-
Vivendo&Aprendendo, tenho a impressão que o seu problema não seria com o QuickReport mas sim sobre como montar um SQL que traga esta informação - e é possível usando select ... where not exists(...).Se você postar na sessão de banco de dados do Access o pessoal pode ajudar lá. Com o resulta do na mão, o relatório você tira de letra porque é simples. Abraços
-
Perguntei, porque no código que você havia postado, um pouco abaixo do loop estava o print, sem o tal first. O que até faz sentido. No caso do quick report, sem usar o preview também deve-se chamar Prepare para que o relatório seja gerado - se bem que o quick não faz impressão direta - ele gera um wmf que é enviado para a impressora. Voce pode saber mais detalhes sobre sua função através do help. No caso deste método para o TQuery, consta:Description Call Prepare to have the BDE and a remote database server allocate resources for the query and to perform additional optimizations. Preparing a query consumes some database resources, so it is good practice to call UnPrepare once the query is no longer needed. If the query will only be executed once, the application does not need to explicitly call Prepare or UnPrepare. Executing an unprepared query generates these calls automatically. However, if the same query is to be executed repeatedly, it is more efficient to prevent these automatic calls by calling Prepare and UnPrepare explicitly. Note: When you change the text of a query at runtime, the query is automatically closed and unprepared. Eu não chamo prepare, porque entendo que isto já é feito automaticamente. No último parágrafo da descrição, logo no início diz: Se a query será executada apenas uma única vez, a aplicação não necessita chamar Prepare ou Unprepare explicitamente. ...continua: "Executando uma query não preparada, gera esta chamada automaticamente." ...e termina: "Entretanto, se a mesma query deve ser executada repetidamente, é mais eficiente evitar estas chamadas automáticas chamando Prepare e Unprepare explicitamente." Na nota também diz: "Quando você modifica o texto da query, em run-time, a query é automaticamente fechada e "despreparada"." Eu posso ter entendido errado esta última parte, e se alguém souber me dizer onde eu agradeço porque ela não deveria estar ali sem um motivo. Mas a verdade é que ao abrir uma consulta não preparada, ela é preparada caso não esteja e ao fechar a consulta ela é automaticamente "despreparada". Então, se eu abrir esta consulta de novo, não tem jeito - vai ter que ser preparada - seja na mão ou automaticamente. :blink: Eu já conferi o código do TQuery em outra oportunidade e realmente ele faz isto, inclusive controla com uma variável interna se a query já está ou não preparada. Acabei de dar uma conferida na TIBQuery e seque com o mesmo procedimento. Então... Abraços
-
Bom, até aqui o que eu ví é a preparação dos dados para o relatório e diz respeito a uma única venda (é o que me parece). Mas no relatório, você não trata nenhum evento? A questão aqui é imprimir mais que uma venda (comentário do seu post#11) ou imprimir uma mesma venda em n vias(comentário do seu post#9)? Só para a gente não se perder no raciocínio. Outra pergunta: o dataset qrItemVenda será utilizado no relatório? Se sim, lembre-se de após o laço que você usa para totalizar os valores, novamente posicionar o dataset no início (frmCaixa.qrItemVenda.First)
-
Bom, por analogia, isto que você relata estaria associado a forma como você está manipulando o dataset. Pode ser um evento errado ou coisa assim.Se bem, que não avançar o dataset seria o pouco provável. O "erro" mais comum seria visualizar certinho no preview e ao mandar para a impressora repetir o último registro n vezes - pelo fato de não ter sido reposicionado o dataset antes da impressão definitiva (impressora). Alguma possibilidade de você postar a parte, seja eventos ou chamadas, onde você está fazendo este controle de itens por página, de cópias, a preparação (os Before...). Talvez vendo o código dê para tentar visualizar algum problema associado ao sintoma citado.
-
Vixe, foi mal. Esqueci completamente que você tinha dito isso no seu post anterior. Essa semana estou com a cabeça nas nuvens. :wacko: No mais, eu pulo fora aqui, porque Fortes não é minha praia não. Acredito que algum outro colega possa lhe ajudar. Abraços
-
dan_visualdm, a cópia pura e simples, pode ser feita utilizando a função da API CopyFile: BOOL CopyFile( LPCTSTR lpExistingFileName, // pointer to name of an existing file LPCTSTR lpNewFileName, // pointer to filename to copy to BOOL bFailIfExists // flag for operation if file exists ); usando...... var Sobrescreve :Boolean; Diretorio : String; {caminho aonde vai ficar salvo as imagens} begin if OpenPictureDialog1.Execute then begin Diretorio := 'C:\teste\imagens\'+ ExtractFileName(OpenPictureDialog1.FileName); if FileExits(Diretório) then Sobrescreve := MessageDlg('O arquivo já existe no destino. Deseja sobrescrevê-lo?', mtConfirmation, [mbOk, mbYes], 0) = mrYes CopyFile(OpenPictureDialog1.FileName, Diretorio, Sobrescreve); Image1.Picture.LoadFromFile(Diretorio); tbl_imagem.Edit; tbl_imagem.CaminhoImg.AsString := Diretorio; tbl_imagem.Post; end; end;Isto deve funcionar (se não esqueci de nada denovo rsrsrs) mas,... aqui fica uma perguntinha extra: E por acaso você pretende armazenar as imagens no formato em que são copiadas (original) ou vai gravar sempre em .jpg, por ex.?Há um tempo fiz este post aqui no forum para gerar os thumbnail (miniaturas do tamanho especificado mantendo o aspecto). Já com relação a conversão para .jpg, tem uma função neste outro post. Assim, dá para combinar tudo isto ser for necessário. Abraços
-
dan_visualdm, esta é a mensagem não é?! Nada como ler direito a mensgem - só agora eu percebi. hehehe Dá uma olhada no texto em que ele diz o tal operador que ele diz estar faltando.... Aquela abelhinha gêmea não está soando muito bem não (trocadilho... bee=abelha; twin=gêmeo) :D a palabra é Between. Pode trocar que deve funcionar. (se não esquecemos de mais nada. rsrsrs) Abraços
-
Parabéns Eder e obrigado por compartilhar estas informações com todos nós. Com certeza poderá vir a ser útil a mais alguém. Abraços
-
Executar script que contenha campo do tipo blob
pergunta respondeu ao kartter de Micheus em Delphi, Kylix
kartter, acredito que neste caso específico você vai precisar fazer uso de uma das ferramentas que acompanha o banco Firebird (eu imagino seja este). A ferramenta para executar scripts deste tipo chama-se isql.exe. E se você precisa mesmo colocar este comando no programa, o que seria pouco comum, acredito que você consiga fazendo uso do a função WinExec e usando como linha de comando algo como: C:\Programme\Firebird2\bin>isql -q -i c:\Scripts\CreateScript.sql Detalhes sobre outros parâmetros do programa neste link Abraços -
dan_visualdm, experimente usar na atribuição ao parâmetro: StrToDate(MaskEdit1.text) e StrToDate(MaskEdit2.text), respectivamente. Aqui, eu acredito que o problema é a forma como o Access trata as datas - ele usa o # como delimitador e não ' (aspas simples). Eu sugiro que você tente fazer o primeiro método funcionar (parametrização), porque evita problemas de portabilidade se no futuro você trocar de banco de dados. Mas, se quiser seguir com esta última abordagem, use o # no lugar das aspas simples. Este último método também não é muito interessante, se você pretende filtrar um período. É melhor que você já o faça na obtenção dos dados, pois estará minimizando o acesso ao banco e minimizando o processamento, já que não será feito o filtro sobre todos os resultados obtidos ao abrir o dataset. Abraços
-
Qual a maneira correta de se fazer esse filtro!
pergunta respondeu ao -Allan- de Micheus em Delphi, Kylix
Allan, pelo componente que você usou (TQuery), você já teve uma introdução dos comandos SQL.Aconselho você a ler algumas apostilas sobre SQL, o colega Jhonas outro dia indicou este link com algumas opções - veja a de SQL básico. Deste post em diante, o colega Jhonas dá algumas explicações ao colega António44 sobre como filtrar os dados dentro de um período. Voce encontrará muitos posts sobre este tipo de filtro, basta pesquisar por between. Mas leia uma apostila sobre SQL básico, depois procure conhecer mais a fundo o SQL oferecido pelo banco de dados que você utiliza (existem algumas diferenças entre eles). Tente então, montar sua consulta e se não conseguir, volte a questionar, mas informe sempre o banco de dados em uso, componente de acesso ao banco e nome da tabela e campos em questão, para que algum colega consiga montar um exemplo para melhor explicar sua dúvida. Abraços -
Vixe, estou ficando loco e ninguém me corrige. :wacko: Tem que acontecer isto mesmo, afinal corrigi o meu erro mas não me "antenei" na movimentação do dataset. Voce só pode carregar a imagem, depois de ter movido o registro: begin ADOQuery1.Next; // esta opção é para o próximo // ADOQuery1.Prior; // este é para o anterior if ADOQuery1.Fields.FieldByName('Imagem').AsString <> '' then if FileExists(ADOQuery1.fields.fieldbyname('imagem').AsString) then Image1.Picture.LoadFromFile(ADOQuery1.fields.fieldbyname('imagem').AsString) end; end;ou seja, primeiro movimenta o dataset (Next ou Prior) e depois, já posicionado no novo registro, é que carrega a imagem atualmente selecionada. Mais um vez, desculpe-me. Abraços
-
Revisando... Aqui o colega Eder informa que o Delphi 4 já está instalado e "funcionando" no Vista. António44, aqui ele diz que a sua dica para fazer a instalação do BDE funcionar deu certo. O que resolveu esta parte do post inicial: Assim, estamos com a seguinte situação: - BDE Administrator: funcionando quando quando acionado via Painel de Controle ou direto na sua pasta de instação - Delphi 4: funcionando "normalmente" e na continuidade do post do dia 9 ele acrescenta: Ou seja, quando ele tenta atribuir um alias através da propriedade DatabaseName de um componente da paleta BDE ele recebe a mensagem de erro lá do começo do tópico: Vou me alongar aqui, para que possam seguir meu raciocínio e quem sabe acrescentar algo mais. Então, dando uma olhada nos fontes, esta mensagem está definida na unit BDEConst.pas: SInitError = 'An error occurred while attempting to initialize the Borland Database Engine (error $%.4x)'; E sua utilização eu encontrei no evento Create do tratador de erros EDBEngineError. A situação em que ela é gerada se dá na condição abaixo: constructor EDBEngineError.Create(ErrorCode: DBIResult); var : : begin FreeTimer(True); FErrors := TList.Create; if not DefaultSession.Active and (ErrorCode <> DBIERR_INTERFACEVER) then begin Message := Format(SInitError, [ErrorCode]); TDBError.Create(Self, ErrorCode, 0, PChar(Message)); end else : end; quando (basicamente) a sessão default não está ativa. Verificando a possibilidade desta situação ocorrer, cheguei a conclusão de que estaria ocorrendo um erro na inicialização da instância default da classe TSessin, visto que a lista de databases é obtido deste objeto. Daí, seguindo o código da classe, lá no StatSession (quando a sessão é iniciada) é feita a inicialização do BDE no método InitializeBDE e este, por sua vez, chamará a funão da API do BDE: DbiInit() Pensando nisto, penso que o BDE também não foi adequadamente instalado (o D4 já foi meio no empurrão :)). Então, com um código simples para o teste: implementation uses DBTables, BDE, BDEConst; {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var ErrorCode: DBIResult; Env: DbiEnv; begin FillChar(Env, SizeOf(Env), 0); StrPLCopy(Env.szLang, SIDAPILangID, SizeOf(Env.szLang) - 1); ErrorCode := DbiInit(@Env); if (ErrorCode <> DBIERR_NONE) and (ErrorCode <> DBIERR_MULTIPLEINIT) then DbiError(ErrorCode) else ShowMessage('BDE iniciado sem erros'); DbiExit; end;tentei simular o erro apontado pelo colega Eder. Inicialmente tudo bem, executei o programa sem erro. Em seguida, renomeei a chave de registros do Windows, que diz respeito ao Database Engine de modo a simular a não existência de uma instalação do BDE. Como resultado, obtive a mensagem de erro que o colega relata. Também executando o BDE Administrator diretamente na pasta, não resultou em erro. Penso que pode mesmo ter sido algum erro ao registrar as informações do BDE. A chave para procura destas informações é: HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Database Engine Eder, dê uma conferida no registro do Windows: menu Iniciar->Executar=> digita RegEdit e veja se você encontra esta chave. Abaixo dela (sub nos) você deve encontra Settings e abaixo dela DRIVERS, REPOSITORIES e SYSTEM. Conforme resposta, acho que todos teremos outras sugestões para tentar ajudar a resolver o seu problema. Abraços
-
dan_visualdm, desculpe minha desatenção. O erro foi meu. :blush: Esqueci de substituir OpenPictureDialog1.Filename na chamada de LoadFromFile. Corrija como abaixo, mas observe que se você usa o mesmo comando para os dois botões como você disse, para um deles você tem que fazer a função do voltar usando o Prior: begin if ADOQuery1.Fields.FieldByName('Imagem').AsString <> '' then if FileExists(ADOQuery1.fields.fieldbyname('imagem').AsString) then Image1.Picture.LoadFromFile(ADOQuery1.fields.fieldbyname('imagem').AsString) end; ADOQuery1.Next; // esta opção é para o próximo // ADOQuery1.Prior; // este é para o anterior end; Abraços
-
Deixa comigo, que esta é minha predileta. :D Mas além de aumentar o banco de dados, eles tem que melhorar o algoritimo - vejam o questionário: O seu personagem é internacionalmente famoso? Yes O seu personagem é fêmea? Yes O seu personagem mora no seu país? No O seu personagem lançou uma música de sucesso? No O seu personagem tem filhos? Yes A sua personagem é casada com um ator? Yes O seu personagem é próximo ao Brad Pitt? Yes O seu personagem tem alguma grande habilidade artística? Yes O seu personagem é Francês? No O seu personagem fez algum tipo de descoberta? No O seu personagem tem lábios grandes? Yes O seu personagem é Americano? No (Yes) O seu personagem é um cantor(a)? No Ele foi bem até o Brad Pitt, depois deu uma mosqueada. Com tudo o que tinha respondido, a probabilidade de ser a Jolie já era bastante alta, então fazer a perguntinha sobre os "lábios grandes" deveria ser a próxima e ainda assim, deu mais uma patinada.
-
Paulo Rodrigo, se a variável $logando é declarada no corpo do código, com escopo global, então dentro da função você precisa "declará-la" deste modo, já que no php nesta situação estará sendo entendida como sendo local - por isso não retornar valor a variável da forma como você espera. Achei um link que explica um pouco melhor isto para você: Escopo de variáveis No caso, teste o código com a alteração abaixo: function erro($erro) { global $logando; // aqui você diz que vai usar a variável global $this->erro = $erro; // Armazena o valor do erro $logando = $this->erro; // AQUI O PROBLEMA QUE VIRA... } Abraços
-
sergio.lima, você não poderia acrescentar o teste do $tipo para cada opção e conforme o valor, seria agregado checked à opção correta? ... <? if ($tipo=1) {echo "checked"} ?> ... <? if ($tipo=3) {echo "checked"} ?> Abraços