segunda-feira, 25 de fevereiro de 2013

Trabalhando com CSV em Delphi 7

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!!



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!

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.

sábado, 4 de junho de 2011

Dificuldade de escolha!! - Filosofia

Bom todos nós nos deparamos diariamente com escolhas. Escolhas essas que nunca são fáceis de fazer seja por um motivo ou outro. Nem sempre a racionalidade nos leva a melhor delas nem mesmo a emoção. Mas o certo e que posso afirmar é que temos que fazê-las. Portanto sugiro que as façamos com calma e frieza pois logicamente dizendo a emoção sempre nos leva a escolhas apenas momentâneamente satisfatórias.

Jullian Henrique Moreira

sexta-feira, 27 de maio de 2011

Filosofia ou Demagogia?

Gostaria de comentar aqui os últimos fatos ocorridos em nosso "Humilde e Democrático País".

1º - Lei contra a "Homofobia"...
Minha Opinião: Essa lei fere diretamente a credibilidade da Democracia de nosso país. Estão dando poderes a uma minoria, que diga-se de passagem, não tem nada a somar para a cultura ou qualquer outro tipo de atividade para a população. Com esta lei estão nos obrigando a aceitar coisas que não queremos, pois a partir de agora quando houver algum atrito com um Homosexual seja por algo que não tenha nada a ver com preconceito sempre haverá uma forma de sermos processados por estarmos praticando Homofobia. Portanto acho um absurdo essa lei e sou totalmente contra.

2º - União Estavél de pessoas de mesmo sexo.
Minha Opinião: Só um contrato entre as partes não bastaria, um testamento ou algo do tipo... mas não o governo tinha que vir a público e legalizar essa infame. Isso fere diretamente os valores familiares e de boa conduta.

3º Aprovação da adoção por casais Gays.
Minha Opinião:O que o filho deste suposto casal responderá quando lhe perguntar.. "Quem é sua mãe?" ou "Quem é seu pai?" e essa criança se deparar com outras crianças que possuem pais Heterossexuais. Já que os "Psicólogos" dos direitos da criança e adolescência adoram se intrometer na criação dos filhos de hoje em dia deveriam ir contra esse tipo de projeto, mas não só estão preocupados em formar marginais preguiçosos e sem utilidade para nosso futuro já que não se pode mais incentivar uma criança a trabalhar e ser responsável pelos seus próprios atos.

Logo abordarei mais assuntos.

Comentem.

terça-feira, 12 de abril de 2011

Conclusões do Dia

Muito bem pessoal!

Hoje concluí que sem planejamento nada dá certo e mesmo com um certo planejamento as coisas apertam. Sempre necessitamos estar preparados para as adversidades que possam vir, portanto, "Um homem preparado nunca é pego de surpresa!". Sábias estas palavras, só que quem as disse acho que não explicou como se preparar!!!!


Abraço!

Segunda Feira

E mais uma semana começa pessoal!! Com fé em Deus e muito trabalho matando um Leão a cada minuto!!

Abraço