porcentagem
O meu sistema é Uma Pesquisa de Satisfação, onde são entrevistadas as pessoas por Fábrica onde tenho 16 questões e são gravadas as opiniões nos campos Bom, Regular, Ruim e Nulo. Preciso fazer a porcentagem de cada uma das opções: Bom, Regular, Ruim e Nulo, observando qual a fábrica e qual o nº da questão...
Queria saber a maneira mais fácil de fazer isso, posso fazer usando SQL?, se minha tabela é do paradox???
Obriagada.
Daia
Respostas
Fred
20/04/2005
Rjun
20/04/2005
Embora Paradox não seja algo que tenha muito conhecimento, como você esta usando TTable acho que nõa ha como usar SQL.
Rjun
20/04/2005
Esqueça a asneira que acabei de postar. Você pode usar SQL sim. Coloque a estrutura da tabela que fica mais facil pra ajudar.
Daia
20/04/2005
dbPesquisa NumPergunta Fábrica Bom Regular Ruim
17FILIAL1000
26FILIAL1000
35_2FILIAL1000
45_1FILIAL1000
55FILIAL1000
64_2FILIAL1000
74_1FILIAL1000
84FILIAL1000
93_2FILIAL1000
103_1FILIAL1000
113FILIAL1000
122_3FILIAL1000
132_2FILIAL1000
142_1FILIAL1000
152FILIAL1000
161FILIAL1000
177MATRIZ000
186MATRIZ000
195_2MATRIZ000
205_1MATRIZ000
215MATRIZ000
224_2MATRIZ000
234_1MATRIZ000
244MATRIZ000
253_2MATRIZ000
263_1MATRIZ000
273MATRIZ000
282_3MATRIZ000
292_2MATRIZ000
302_1MATRIZ000
312MATRIZ000
321MATRIZ000
Este são os dados que tenho gravados na minha tabela...
é isso que tu precisa???
Daia
20/04/2005
SELECT * FROM DBPESQUISA WHERE FABRICA=´MATRIZ´ AND NUMPERGUNTA=´1´
mas aí preciso fazer o label receber este resultado, não consegui...
Rjun
20/04/2005
1) Os campos BOM/REGULAR/RUIM serão totalizados a cada resposta ?
2) Existem valores 2_3, 3_2. São números de perguntas ?
3) Você quer uma porcentagem de respostas for filial ? Ex:
Filial 1/ Pergunta 1 => Bom= 30; Ruim = 20; Regular = 15;
resultado
Bom = 46,15¬
Ruim = 30,76¬
Regular = 23,09¬
É isso ?
Daia
20/04/2005
Sim
Rjun
20/04/2005
Em vez de usar SQL, crie mais tres campos na tabela para guardar a porcentagem de cada resposta. No evento BeforePost faça os calculos para guardar a porcentagem.
PRegular = Regular / (Regular+Bom+Ruim) * 100;
PRuim = Ruim / (Regular+Bom+Ruim) * 100;
PBom = Bom / (Regular+Bom+Ruim) * 100;
Daia
20/04/2005
Só não entendi porque (Regular+Bom+Ruim) somas estes valores??
Rjun
20/04/2005
Como você faria o cálculo das porcentagens ?
Daia
20/04/2005
Sei lá, eu imaginava isso...
Daia
20/04/2005
Rjun
20/04/2005
134 * 100 / 100 = 134¬
Pela sua 2ª fórmula :
134 / 100 * 100 = 134¬.
Para achar a porcentagem voce deve dividir o total de respostas que voce quer (regular) pelo total geral de respostas dadas (regular+bom+ruim) e multiplicar por 100.
Daia
20/04/2005
Coloquei no BeforePost o seguinte código, mas não dá certo...
Mas se eu fizer como tu falou ele vai pegar todos os Regular, ruim e bom, pois não estou especificando fabrica na hora de gravar, preciso fazer esta porcentagem por fábrica e NumPergunta...
Pesquisa.FieldByName(´PBom´).AsString := (Pesquisa.FieldByName(´Bom´).AsString / (Pesquisa.FieldByName(´Regular´).AsString + Pesquisa.FieldByName(´Ruim´).AsString + Pesquisa.FieldByName(´Bom´).AsString) * ´100´
Daia
20/04/2005
Pesquisa.FieldByName(´PBom´).Value := (Pesquisa.FieldByName(´Bom´).Value / (Pesquisa.FieldByName(´Regular´).Value + Pesquisa.FieldByName(´Ruim´).Value + Pesquisa.FieldByName(´Bom´).Value)) * 100;
mas dá um erro de Invalid Floating Operator
Rjun
20/04/2005
Voce esta tentando somar string ?
Voce deveria fazer isso :
var Porc: Double; begin Porc := (Pesquisa.FieldByName(´Bom´).AsInteger / (Pesquisa.FieldByName(´Regular´).AsInteger + Pesquisa.FieldByName(´Bom´).AsInteger + Pesquisa.FieldByName(´Ruim´).AsInteger) * 100; Pesquisa.FieldByName(´PBom´).AsString := FormatFloat(´#.´, Porc);
Não sei se é um boa você trabalhar com numeros e usar tipo string para salvar esses valores.
Daia
20/04/2005
O que faço??
Rjun
20/04/2005
Daia
20/04/2005
Porc := ((Pesquisa.FieldByName(´Bom´).AsInteger / (Pesquisa.FieldByName(´Regular´).AsInteger + Pesquisa.FieldByName(´Bom´).AsInteger + Pesquisa.FieldByName(´Ruim´).AsInteger)) * 100);
Rjun
20/04/2005
Porc := Pesquisa.FieldByName(´Bom´).asInteger / (Pesquisa.FieldByName(´Bom´).asInteger + Pesquisa.FieldByName(´Rium´).asInteger + Pesquisa.FieldByName(´Regular´).asInteger) * 100;
Daia
20/04/2005
Não sei o que fazer??
Edilcimar
20/04/2005
Daia
20/04/2005
Rjun
20/04/2005
Daia
20/04/2005
var
Porc: Double;
begin
Porc := (Pesquisa.FieldByName(´Bom´).AsInteger) / (Pesquisa.FieldByName(´Regular´).AsInteger + Pesquisa.FieldByName(´Bom´).AsInteger + Pesquisa.FieldByName(´Ruim´).AsInteger) * 100 ;
Pesquisa.FieldByName(´PBom´).AsString := FormatFloat(´#.´, Porc);
end;
Rjun
20/04/2005
Eu copiei seu código e funcionou normalmente. Como você definiu o campo PBOM ?
Daia
20/04/2005
Edilcimar
20/04/2005
Rjun
20/04/2005
Daia
20/04/2005
Mas acho q a minha definição está certa...
Edilcimar
20/04/2005
Rjun
20/04/2005
Onde você viu defini era pra ser define.
Daia
20/04/2005
Rjun
20/04/2005
Daia
20/04/2005
defini os campos PBom, PRegular, PRuim e PNulo como Alpha tamanho 10. E deixei o código do Before Post como estava, mas não está funcionando... que merda isso...
Daia
20/04/2005
Edilcimar
20/04/2005
coloque os campos como inteiro e o campo resposta como number
Daia
20/04/2005
Porc := (Pesquisa.FieldByName(´Bom´).AsInteger) / (Pesquisa.FieldByName(´Regular´).AsInteger + Pesquisa.FieldByName(´Bom´).AsInteger + Pesquisa.FieldByName(´Ruim´).AsInteger) * 100 ;
este acima é o código... Os campos Bom, Regular, Ruim estão definidos como integer...
Rjun
20/04/2005
Edilcimar
20/04/2005
portanto aqui eles estão string
Daia
20/04/2005
Rjun
20/04/2005
Daia
20/04/2005
Rjun
20/04/2005
Rjun
20/04/2005
Edilcimar
20/04/2005
Rjun
20/04/2005
Porc := 0; Total := (Pesquisa.FieldByName(´Regular´).AsInteger + Pesquisa.FieldByName(´Bom´).AsInteger + Pesquisa.FieldByName(´Rium´).AsInteger); if Total <> 0 then Porc := Pesquisa.FieldByName(´BOM´).AsInteger / Total * 100; Pesquisa.FieldByName(´PBom´).AsString := FormatFloat(´#.´, Porc);
Daia
20/04/2005
portanto aqui eles estão string[/quote:369ad269a5]
mudei eles para Number... mas mesmo assim não funciona...
Edilcimar
20/04/2005
Daia
20/04/2005
Não está correto...
Rjun
20/04/2005
Daia
20/04/2005
1 7MATRIZ0004
2 6MATRIZ0004
3 5_2MATRIZ0004
4 5_1MATRIZ0004
5 5MATRIZ0004
6 4_2MATRIZ0004
7 4_1MATRIZ0004
8 4MATRIZ0004
9 3_2MATRIZ0004
10 3_1MATRIZ0004
11 3MATRIZ0004
12 2_3MATRIZ1005100.00
13 2_2MATRIZ1005100.00
14 2_1MATRIZ1005100.00
15 2MATRIZ1005100.00
16 1MATRIZ2004100.00
Rjun
20/04/2005
Edilcimar
20/04/2005
0+0+0 = 0 e 0/0 = infinito e lá está 4
está faltando else total <> 0 o pbom = 0
pegue o 12
1+0+0 = 1 e 1/1 * 100 = 100 este está certo
Daia
20/04/2005
Daia
20/04/2005
Porc := 0;
Total := (Pesquisa.FieldByName(´Regular´).AsInteger + Pesquisa.FieldByName(´Bom´).AsInteger + Pesquisa.FieldByName(´Ruim´).AsInteger);
if Total <> 0 then
Porc := Pesquisa.FieldByName(´Bom´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PBom´).AsString := FormatFloat(´#.´, Porc);
Rjun
20/04/2005
Se os nulos forem válidos para o calculo da porcentagem, você deve soma-los ao total na hora do calculo, quando vc soma o bom+regular+ruim.
Edilcimar
20/04/2005
Rjun
20/04/2005
Daia
20/04/2005
procedure TFPesquisa.PesquisaBeforePost(DataSet: TDataSet);
var
Porc: Double;
Total: double;
begin
Porc := 0;
Total := (Pesquisa.FieldByName(´Regular´).AsInteger + Pesquisa.FieldByName(´Bom´).AsInteger + Pesquisa.FieldByName(´Ruim´).AsInteger);
if Total <> 0 then
Porc := Pesquisa.FieldByName(´Bom´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PBom´).AsString := FormatFloat(´#.´, Porc);
Porc := Pesquisa.FieldByName(´Regular´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PRegular´).AsString := FormatFloat(´.´, Porc);
Porc := Pesquisa.FieldByName(´Ruim´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PRuim´).AsString := FormatFloat(´.´, Porc);
Porc := Pesquisa.FieldByName(´Nulo´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PNulo´).AsString := FormatFloat(´.´, Porc);
end;
Rjun
20/04/2005
Total := (Pesquisa.FieldByName(´Regular´).AsInteger + Pesquisa.FieldByName(´Bom´).AsInteger + Pesquisa.FieldByName(´Ruim´).AsInteger + Pesquisa.FieldByName(´Nulo´).AsInteger);
Edilcimar
20/04/2005
o campo deverá ter um valor = zero
Rjun
20/04/2005
Coloque o trecho apos then dentro de um begin...end
[code]
begin
Porc := Pesquisa.FieldByName(´Bom´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PBom´).AsString := FormatFloat(´#.´, Porc);
Porc := Pesquisa.FieldByName(´Regular´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PRegular´).AsString := FormatFloat(´.´, Porc);
Porc := Pesquisa.FieldByName(´Ruim´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PRuim´).AsString := FormatFloat(´.´, Porc);
Porc := Pesquisa.FieldByName(´Nulo´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PNulo´).AsString := FormatFloat(´.´, Porc);
end;
Edilcimar
20/04/2005
Porc := 0;
Total := (Pesquisa.FieldByName(´Regular´).AsInteger + Pesquisa.FieldByName(´Bom´).AsInteger + Pesquisa.FieldByName(´Ruim´).AsInteger);
if Total <> 0 then
BEGIN
Porc := Pesquisa.FieldByName(´Bom´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PBom´).AsString := FormatFloat(´#.´, Porc);
Porc := Pesquisa.FieldByName(´Regular´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PRegular´).AsString := FormatFloat(´.´, Porc);
Porc := Pesquisa.FieldByName(´Ruim´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PRuim´).AsString := FormatFloat(´.´, Porc);
Porc := Pesquisa.FieldByName(´Nulo´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PNulo´).AsString := FormatFloat(´.´, Porc);
end
ELSE
BEGIN
todos os campos = 0
END
end;
Rjun
20/04/2005
Desse modo, o teste If Teste <> 0 se faz desnecessário. Mas, se você se sentir com mais segurança fazendo o teste, deixe-o assim mesmo.
Daia
20/04/2005
Só achei que toda vez tivesse que zerar o Porc igual ao que eu fiz abaixo:
procedure TFPesquisa.PesquisaBeforePost(DataSet: TDataSet);
var
Porc: Double;
Total: double;
begin
Porc := 0;
Total := (Pesquisa.FieldByName(´Regular´).AsInteger + Pesquisa.FieldByName(´Bom´).AsInteger + Pesquisa.FieldByName(´Ruim´).AsInteger + Pesquisa.FieldByName(´Nulo´).AsInteger);
if Total <> 0 then begin
Porc := 0;
Porc := Pesquisa.FieldByName(´Bom´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PBom´).AsString := FormatFloat(´#.´, Porc);
Porc := 0;
Porc := Pesquisa.FieldByName(´Regular´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PRegular´).AsString := FormatFloat(´.´, Porc);
Porc := 0;
Porc := Pesquisa.FieldByName(´Ruim´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PRuim´).AsString := FormatFloat(´.´, Porc);
Porc := 0;
Porc := Pesquisa.FieldByName(´Nulo´).AsInteger / Total * 100;
Pesquisa.FieldByName(´PNulo´).AsString := FormatFloat(´#.´, Porc);
end;
end;
Rjun
20/04/2005
Daia
20/04/2005
Rjun
20/04/2005
Agora, por que o campo tem quer ser BOM ? Como e em que momento você pretende mostrar o label ?
Daia
20/04/2005
Vou ter um botão ´Resultado´, quando eu clicar nele ele vai me abrir um panel com os resultados da pesquisa por exemplo:
MATRIZ
20¬ ACHAM BOM
50¬ ACHAM REGULAR
20¬ ACHAM RUIM
10¬ NULO
FILIAL 1
60¬ ACHAM BOM
10¬ ACHAM REGULAR
20¬ ACHAM RUIM
10¬ NULO
.
.
.
OS VALORES DE PORCENTAGEM DEVEM SER OS VALORES DA TABELA: PBOM,PREGULAR,PRUIM,PNULO....
ACHO QUE NADA A VER ISSO QUE COLOQUEI: NÃO PRECISO SABER QUANDO O CAMPO É BOM OU REGULAR...
Rjun
20/04/2005
Daia
20/04/2005
procedure TFPesquisa.BitBtn1Click(Sender: TObject);
begin
if not Pesquisa.Locate(´NumPergunta;Fabrica´, VarArrayOf([´1´, ´MATRIZ´]) ,[]) = false then
lbBom.Caption := Pesquisa.fieldByName(´PBom´).AsString ;
end;
Rjun
20/04/2005
Tire o not da frente do locate. Agora você quer achar um registro. O locate acha e retorna True, com o not na frente, fica Not True e ele não entra no if.
Daia
20/04/2005
Tirando o not ele não me trouxe o resultado... deixando o not ele me mostra o resultado.
Acho que a minha instrução está correta, pois estou usando =false, então se não for vazio, ele mostra o resultado. Não está correto assim??
Daia
20/04/2005
o que eu deveria fazer é tirar o not da frente do locate e no lugar do ´= false´ colocar ´=true´ aí tb funcionaria ou deixar sem igual a nada e tirar o not, isso tb funcionaria...
Rjun
20/04/2005
Quando você usa um função que retorna um booleano, não precisa comparar com true ou false.
Do jeito que você fez esta correto, embora pouco usual.
Mas, esta funcionando ?
Daia
20/04/2005
tirei o ´= false´...
Por enquanto está funcionando!! :D
Com muito sacrifício, mas tá!!
Vc está sempre no fórum... é claro que não vou fikr te enchendo o saco, mas a tua ajuda foi muito boa, vc deve programar a muito tempo!
Muito Obrigada... Obrigada mesmo!!
Rjun
20/04/2005
rogerio.jun@uol.com.br
No mais, disponha...