Pessoal...
Boa Tarde!!
Hoje me deparei com uma necessidade que sempre tentei evitar, trabalhar com um arquivo CSV em Delphi 7.
Li em muitos foruns que a partir da versão 2006 do Delphi podemos utilizar uma propriedade "StrictDelimiter" do StringList para fazer esse trabalho, o que facilitaria imensamente o nosso trabalho, contudo a necessidade de utilizar o Delphi 7 falou mais alto (Nosso chefe não quer migrar para uma versão mais atualizada).
Então aqui vai a função que criei com a ajuda dos colegas dos fóruns.
function GetValorNaPosicao(pLinha, pDelimitador : String; pPos : Integer) : String;
var
iChar : Integer;
vPos : Integer;
Str : String;
begin
Str := '';
vPos := 1;
for iChar := 1 to Length(pLinha) do
begin
if pLinha[iChar] <> pDelimitador then
Str := Str + pLinha[iChar]
else
begin
if vPos = pPos then
Break
else
begin
vPos := vPos + 1;
Str := '';
end;
end;
end;
Result := Str;
end;
Esta função leva em consideração que você passará a linha que contém os valores e não todo o arquivo.
Agora o restante é com vocês...
Abraço!!
Desenvolvendo projetos e mentes
Blog com minhas experiências na programação... de tudo um pouco, Object Paschal, Java, C#, SQL etc... Sempre quando eu passar por algo difícil e conseguir resolver será compartilhado aqui!!!
Novo AdSense
segunda-feira, 25 de fevereiro de 2013
quinta-feira, 8 de novembro de 2012
Trabalhando com campo Date em Sybase
Bom dia a todos da internet!
Sei que é meio antiquado falar deste banco de dados... rsrsrsrs
Mas ainda trabalho com ele aqui na empresa, e venho passando por alguns problemas com campos do tipo Date ou DateTime.
Pois bem vamos ao problema para podermos apresentar a solução (Que resolveu no meu caso.):
Quando efetuamos uma Query via conexão ODBC e colocamos o retorno deste campo em um atributo do tipo String, a conexão ODBC interpreta o tipo NULL como a data '1899-12-30', isso faz com que o atributo seja diferente de ''(String vazia), então quando este atributo não é tratado e um comando de "Insert" ou "Update" é executado no sistema a data '1899-12-30' é colocada no banco de dados.
Após este ocorrido quando executamos uma consulta no banco de dados procurando por datas do tipo NULL os dados que receberam a data '1899-12-30' não retornam. Isso já era esperado até porque '1899-12-30' é diferente de NULL, mas nem sempre isso é lembrado ao fazermos uma seleção com o critério NULL envolvido.
Portanto depois de algumas avaliações em bases que já estão rodando a algum tempo cheguei a uma conclusão e criei alguns passos para seleção neste tipo de caso:
1º - Quando o critério "IS NULL" é utilizado as Datas iguais a "1899-12-30" não são selecionadas.
2º - Quando o critério "1899-12-30" é utilizado com o operador "=" apenas as registros com essa data é retornado.
3º - Qaundo o critério "IS NOT NULL" é utilizado a data ''1899-12-30" é incluída na seleção.
4º - Para selecionar data nulas utilizamos a seguinte sintaxe:
- ...Where Campo IS NULL or Campo = '1899-12-30';
5º - Para selecionar datas não nulas utilizamos a seguinte sintaxe:
- ...Where Campo IS NOT NULL or Campo <> '1899-12-30';
E por hoje é só pessoal. Espero ter ajudado (Pelo menos um!)....
Abraço!
Sei que é meio antiquado falar deste banco de dados... rsrsrsrs
Mas ainda trabalho com ele aqui na empresa, e venho passando por alguns problemas com campos do tipo Date ou DateTime.
Pois bem vamos ao problema para podermos apresentar a solução (Que resolveu no meu caso.):
Quando efetuamos uma Query via conexão ODBC e colocamos o retorno deste campo em um atributo do tipo String, a conexão ODBC interpreta o tipo NULL como a data '1899-12-30', isso faz com que o atributo seja diferente de ''(String vazia), então quando este atributo não é tratado e um comando de "Insert" ou "Update" é executado no sistema a data '1899-12-30' é colocada no banco de dados.
Após este ocorrido quando executamos uma consulta no banco de dados procurando por datas do tipo NULL os dados que receberam a data '1899-12-30' não retornam. Isso já era esperado até porque '1899-12-30' é diferente de NULL, mas nem sempre isso é lembrado ao fazermos uma seleção com o critério NULL envolvido.
Portanto depois de algumas avaliações em bases que já estão rodando a algum tempo cheguei a uma conclusão e criei alguns passos para seleção neste tipo de caso:
1º - Quando o critério "IS NULL" é utilizado as Datas iguais a "1899-12-30" não são selecionadas.
2º - Quando o critério "1899-12-30" é utilizado com o operador "=" apenas as registros com essa data é retornado.
3º - Qaundo o critério "IS NOT NULL" é utilizado a data ''1899-12-30" é incluída na seleção.
4º - Para selecionar data nulas utilizamos a seguinte sintaxe:
- ...Where Campo IS NULL or Campo = '1899-12-30';
5º - Para selecionar datas não nulas utilizamos a seguinte sintaxe:
- ...Where Campo IS NOT NULL or Campo <> '1899-12-30';
E por hoje é só pessoal. Espero ter ajudado (Pelo menos um!)....
Abraço!
sexta-feira, 23 de setembro de 2011
Unit em Delphi para Consultas de DSNs
unit DSNFuncs;
{Créditos para Oscar Noe Martin
Fonte pego no endereço http://www.delphi3000.com/articles/article_3584.asp?SK=
Comentários traduzidos por Jullian Henrique Moreira
23/09/2011
}
interface
Uses Windows, Classes, SysUtils, Registry;
Type
TDSN_Type = (dtUSER, dtSYSTEM);
TDSN_Types = Set of TDSN_Type;
function GetODBCDriversList: TStrings;
function GetDSNList (aDSN_TYPES: TDSN_Types; aDriverFilter: String): TStrings;
implementation
function GetODBCDriversList: TStrings;
//Esta função retornará uma lista dos Drivers ODBC instalados
// Example: combobox1.Assign(GetODBCDriversList); // ;)
var
aStringlist : TStringlist;
aRegistry : TRegistry;
Begin
aStringlist:= Tstringlist.Create;
aRegistry:= TRegistry.Create;
Result:= Tstringlist.Create;
with aRegistry do
Begin
rootkey:= HKEY_LOCAL_MACHINE;
OpenKey('Software\ODBC\ODBCINST.INI\ODBC Drivers',False);
GetValueNames(aStringlist);
End;
aRegistry.Free;
aStringlist.Sort;
result.AddStrings(aStringlist);
aStringlist.Free;
End;
function GetDSNList (aDSN_TYPES: TDSN_Types; aDriverFilter: String): TStrings;
// Esta função retorna uma lista de DSNs( DSNs de Usuários (dtUser),
// DSNs de Sistema (dtSystem), ou ambas), onde o Driver contém aDriverFilter,
// pode ser o nome completo do driver ou apenas parte dele;
// (Exemplo: 'Microsoft Access Driver (*.mdb)' or 'Access').
//
// Exemplo: listbox1.Items.Assign(GetDSNList([dtUser,dtSystem],'Access');
// Irá retornar uma lista com todos os DSNs existentes tanto User quanto System
// com a string 'Access' no nome do Driver.
var
aStringList : TStringlist;
aStrings1 : TStrings;
aStrings2 : Tstrings;
aString : String;
aRegistry : TRegistry;
aInt : Integer;
Begin
aStringlist:=TStringlist.Create;
aStrings1:=TStringlist.Create;
aStrings2:=TStringlist.Create;
If dtUSER in aDSN_TYPES then
Begin
aRegistry:= Tregistry.Create;
With aRegistry do
Begin
RootKey:=HKEY_CURRENT_USER;
OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',False);
GetValueNames(aStrings1);
for aInt:=aStrings1.Count-1 downto 0 do
Begin
aString:= ReadString(aStrings1.Strings[aInt]);
if ((Pos( aDriverFilter, aString ) = 0) and (aDriverFilter<>'')) then
aStrings1.Delete(aInt);
End;
End;
aRegistry.Free;
end;
If dtSYSTEM in aDSN_TYPES then
Begin
aRegistry:= Tregistry.Create;
With aRegistry do
Begin
RootKey:=HKEY_LOCAL_MACHINE;
OpenKey('Software\ODBC\ODBC.INI\ODBC Data Sources',False);
GetValueNames(aStrings2);
for aInt:=aStrings2.Count-1 downto 0 do
Begin
aString:= ReadString(aStrings2.Strings[aInt]);
if ((Pos( aDriverFilter, aString) = 0) and (aDriverFilter<>'')) then
aStrings2.Delete(aInt);
End;
End;
aRegistry.Free;
end;
aStringlist.AddStrings(aStrings1);
aStrings1.Free;
aStringlist.AddStrings(aStrings2);
aStrings2.Free;
aStringlist.Sort;
result:= Tstringlist.Create;
result.Assign(aStringlist);
End;
end.
Assinar:
Postagens (Atom)