segunda-feira, 12 de março de 2012

Manipulação de arquivos texto no delphi


Bem, vamos falar inicialmente da escrita de arquivos texto. Existem algumas palavras reservadas, das quais irei falar de apenas algumas delas, que serão abordadas neste artigo. Para conhecer todas as palavras reservadas, relacionadas a manipulação de arquivos, entrem no help do Delphi com o seguinte tema: "Input and output procedures and functions"

Palavra Reservada
Função
AssignFile
Associa o arquivo manipulado a uma variável do tipo File
Append
Abre um arquivo existente para inserção de novos dados
Eof
Verifica se a posição atual do cursor indica o fim do arquivo
Write / Rewrite
Escreve valores diversos no arquivo. O rewrite após a escrita posiciona o cursor na próxima linha do arquivo
Read / Readln
Lê diversos valores no arquivo. O readln após a leitura posiciona o cursor na próxima linha do arquivo

Bem, irei agora explicitar dois exemplos contendo a manipulação de arquivos textos. O primeiro deles, ilustrará a inserção de dados em um arquivo. O segundo irá ilustrar a leitura de dados.

function GravaArquivoLogTransacao(TipoTransacao: TTipoTransacao): Integer;
const
NomArquivo: String = "LogTransacao.txt";
var
Path: String;
Arquivo: TextFile;
begin
        Path := ExtractFilePath(Application.ExeName);
        if not DirectoryExists(Path) then begin
                CreateDir(Path);
        end;
        if not FileExists(Path + NomArquivo) then begin
                FileCreate(Path + NomArquivo);
        end;
        Try
        AssignFile(Arquivo, Path + NomArquivo);
        Append(Arquivo);
        Write(Arquivo, FormatFloat("000000", Transacao.TransactionID) + " / " + FormatFloat("000000", Transacao.GlobalID));
        case TipoTransacao of
        ttBeginTran: WriteLn(Arquivo, " - BeginTran: " + DateToStr(Date) + " " + TimeToStr(Time) + " por usuário: " + IntToStr(UserID));
        ttCommit: WriteLn(Arquivo, " - Commit: " + DateToStr(Date) + " " + TimeToStr(Time) + " por usuário: " + IntToStr(UserID));
        ttRollBack: WriteLn(Arquivo, " - RollBack: " + DateToStr(Date) + " " + TimeToStr(Time) + " por usuário: " + IntToStr(UserID));
end;
CloseFile(Arquivo);
Result := 1;
Except
Result := -1;
End;
end;
Na função acima, ilustro a geração de um log de transações de uma aplicação. Observe que as palavras que realizam a "escrita" no arquivo estão destacadas.
procedure LeArquivoLogTransacao(NomeArquivo: String);
var
strFile: TextFile;
strLine: String;
begin
        AssignFile(strFile, NomeArquivo);
        Reset(strFile);
        Readln(strFile, strLine);
        while not Eof(strFile) do begin
                ShowMessage(strLine);
                Readln(strFile, strLine);
        end;
end;
Já na função acima, realizamos a leitura do arquivo e lançamos uma mensagem contato o conteúdo lido a cada linha.

Como calcular preço de venda [passo-a-passo]


O Brasil tem um mercado informal  muito aberto e, muitas vezes, os trabalhadores autônomos se perdem ao calcular o preço de seus produtos de forma a pagar todas as suas despesas e ainda tirar um lucro legal. Existem alguns cursos voltados para este fim, com dicas de criação, formação de preço e gerenciamento do seu negócio (o SEBRAE é um excelente exemplo disso). Mas para uma pergunta simples, existe também respostas simples. Para facilitar a vida desses pequenos negócios, o Formigueiros também é cultura e explica passo-a-passo como se calcula o preço de venda de um produto. Para calcular é preciso ter as informações conforme exemplo abaixo:

1) Custo unitário do produto: R$ 12,50;
2) Percentual de despesas variáveis*: 9% (sendo 4% do simples nacional + 5% da comissão de vendas);
3) Percentual de despesas fixas**: 25% (esse percentual é medido pelo total das despesas fixas sobre o faturamento. Neste exemplo, utiliza-se o faturamento total de R$ 144.000,00 e despesas fixas de R$ 36.000,00, ou seja, 36.000/144.000,00 = 0,25 *100 = 25%);
4) Defina sua margem de lucro líquido: 12% (aqui você irá definir quanto você quer ter de lucro com o produto vendido já deduzidas todas as despesas);
5) Deduza de 100% as despesas acima citadas (fixas, variáveis e licro líquido): 100% – 46% = 54% (este é o percentual que deve ser aplicado sobre o preço unitário de compra do produto para definir qual o seu preço de venda);
6) Divida o custo unitário (de compra) por 54 (e multiplique por 100): R$ 12,50/54 * 100 = R$ 23,15

NOTA: Despesas fixas são as despesas permanentes da empresa como água, luz, telefone, aluguel, etc. Já as despesas variáveis são, como o próprio nome diz, despesas eventuais ou sem valor permanente como encargos, aquisição de bens ou produtos, etc.
Pronto, este é o valor de venda do seu produto. A dica é do blog do Élcio. Boas vendas e sucesso nos seus negócios.

Cálculo ICMS CST 00

Como prometido, vamos iniciar a explicação para o calculo da CST de ICMS 00, e suas possíveis variações.

ICMS CST 00 quer dizer, Tributada Integralmente. Para calcular este ICMS é simples, basta multiplicar a base de calculo(veja como aqui obter a base de calculo) pelo aliquota estabelecida.

Mais ou menos assim:

Base = 100,00

Alíquota = 17%

Valor ICMS = 100,00 x 17% = 17,00

Simples né? Então vamos começar a complicar

Embora a operação seja tributada integralmente, ela pode possuir Alíquota de ICMS reduzida.
A alíquota de ICMS também muda de acordo com o estado de origem x destino da mercadoria.

Algumas regras básicas:

1 – Venda para consumidor final, não contribuinte do ICMS, residente em UF diversa do emitente da nota fiscal, aplica-se a alíquota interna da UF do emissor da nota fiscal.

2 – Venda para consumidor final, contribuinte do ICMS, residente em UF diversa do emitente da nota fiscal, aplica-se a alíquota interestadual entre as UF’s.

3 – Venda para contribuinte do ICMS que não seja consumidor final, aplica-se a alíquota interestadual.

Obs: Como já citei anteriormente, a alíquota do ICMS é uma característica do ITEM da nota, então dentro de uma nota, pode ter vários itens tributados integralmente, mas cada um com alíquota de ICMS diferente. E isso em operações internas(dentro do estado)

Precisa prestar atenção a tabela de alíquota entre UF’s (Confira a tabela aqui)

Lembrando, essas regras são aplicadas para a operações tributadas integralmente, ou seja, CST 00.

quinta-feira, 8 de março de 2012

Evitar que a aplicação trave ao executar um processo grande

Já devemos ter precisado executar um comando muito grande e, para ficar mais amigável ao usuário, colocar uma barrinha de progresso, para avisá-lo em que estágio de processamento está.

Porém, nos deparamos com um pequeno problema: Nossa aplicação fica travada enquanto executa o comando!! Como resolver isto?

Existe um método chamado Application.ProcessMessages;   que força a aplicação processas as mensagens do sistema operacional, como por exemplo a exibição correta do form. Com isto, não só o form é visualizado corretamente, mas também nossa barrinha de progresso funciona perfeitamente. :D

Vejamos um exemplo simples:

Digamos que tenhamos um ADOTable com vários registros abertos e vamos percorrer um a um:

ADOTable1.First;
  while not (ADOTable1.Eof) do
  begin
      lblStatus.Caption := 'Processando registro...'; // exibimos alguma mensagem
      Application.ProcessMessages; // chamados o método que força o SO a desenha a janela
      ADOTable1.Next; // pula para o próximo registro da tabela
  end;

Pronto. Agora é só você implementar uma barra de progresso e colocar mais algumas perfumarias (objetos que deixam a cara do formulário mais amigável para o usuário) caso seja necessário :)

segunda-feira, 30 de janeiro de 2012

Detectando o Numero Serial do HD

Function SerialNum(FDrive:String) :String;
Var
    Serial:   DWord;
    DirLen,Flags: DWord;
    DLabel : Array[0..11] of Char;
begin
     Try GetVolumeInformation(PChar(FDrive+':\'),dLabel,12,@Serial,DirLen,Flags,nil,0);
            Result := IntToHex(Serial,8);
       Except Result :='';
end;
end;

Recuperar a Velocidade da CPU

Esta interessante função recupera a velocidade de processamento aproximada da CPU:

const
ID_BIT=$200000; // EFLAGS ID bit
 
function GetCPUSpeed: Double;
const
DelayTime = 500;
var
TimerHi, TimerLo: DWORD;
PriorityClass, Priority: Integer;
begin
try
PriorityClass := GetPriorityClass(GetCurrentProcess);
Priority := GetThreadPriority(GetCurrentThread);
 
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread,THREAD_PRIORITY_TIME_CRITICAL);
 
Sleep(10);
asm
dw 310Fh // rdtsc
mov TimerLo, eax
mov TimerHi, edx
end;
Sleep(DelayTime);
asm
dw 310Fh // rdtsc
sub eax, TimerLo
sbb edx, TimerHi
mov TimerLo, eax
mov TimerHi, edx
end;
 
SetThreadPriority(GetCurrentThread, Priority);
SetPriorityClass(GetCurrentProcess, PriorityClass);
 
Result := TimerLo / (1000.0 * DelayTime);
except end;
end;
No evento OnClick, basta atribuir a saída da função a uma string:

procedure TForm1.Button1Click(Sender: TObject);
var cpuspeed:string;
begin
cpuspeed:=Format('%f MHz', [GetCPUSpeed]);
edit1.text := cpuspeed;
end;

Verificando o tipo de Drive

Verificando o tipo de Drive

O código abaixo implementa uma função para testar qual o tipo de drive da unidade especificada.

Para isto, é necessário utilizar uma função de API do windows chamada GetTypeDrive.

Esta função retorna valores default que indicam o tipo de drive selecionado.(Drive_Removable,Drive_Fixed,Drive_Remote,Drive_CdRom,Drive_RamDisk)

Código Completo:

Function Tipo_Drive(Drive:Char):String;
Const
Drive_Removable = 2;
Drive_Fixed = 3;
Drive_Remote = 4;
Drive_CdRom = 5;
Drive_RamDisk = 6;
var
Tipo: byte;
begin
Tipo := GetDriveType(PChar(Drive + ':\'));
Case Tipo of
0: Result := 'Indeterminado';
1: Result := 'Inexistente ';
2: Result := 'Removível';
3: Result := 'Fixo';
4: Result := 'Rede';
5: Result := 'CD-ROM';
6: Result := 'RAM Disk';
else Result := ' Erro';
End;
end;

Curso de Delphi: 7.Consultas SQL