CONVERTER N¬šÃ€ŠÂº ROMANOS
Olá meu grande amigos estou com uma missão acho que quase impossÃvel um cliente me solicitou fazer uma rotina que somasse nº romanos que seria dessa forma,no campo TIPO na tabela ACIDENTES tem os dados que são lançadas em Nº ROMANOS precisaria de uma rotina que convertesse esses números romanos para fazer a seguinte consulta em SQL:
"SELECT COUNT(*) AS TOTAL FROM ACIDENTES WHERE TIPO >=I AND TIPO <IV"
Se fosse em numeral era fácil mas agora em números romanos não consegui,conto com a ajuda dos senhores,abraço pessoal.
"SELECT COUNT(*) AS TOTAL FROM ACIDENTES WHERE TIPO >=I AND TIPO <IV"
Se fosse em numeral era fácil mas agora em números romanos não consegui,conto com a ajuda dos senhores,abraço pessoal.
no bd grava como romano?
nao resolveria vc. "enganar" o cliente, vc. cria um campo auxiliar, e grava o valor em numeral normal, dai vc. filtra pelo campo auxiliar...
faiz uma funcao quando ele informatr I no text, vc. grava 1 no campo auxiliar... e assim por diante... na hora do mala pedir o relatorio vc. converte o que o cidadao pediu e filtra em cima do auxiliar...
Blz
nao resolveria vc. "enganar" o cliente, vc. cria um campo auxiliar, e grava o valor em numeral normal, dai vc. filtra pelo campo auxiliar...
faiz uma funcao quando ele informatr I no text, vc. grava 1 no campo auxiliar... e assim por diante... na hora do mala pedir o relatorio vc. converte o que o cidadao pediu e filtra em cima do auxiliar...
Blz
Amigão os dados são lançados como romanos mesmo,seria muito trabalhoso para mim ter outro campo numeral,já tinha pensando nisso,será muito ruim,fora os dados que irão gerar que serão muitos.
Luis,
Desculpe meter a colher...
Mas, consideremos o seguinte:
é possÃvel que a quantidade de alternativas não seja tão grande.
Se isso é verdadeiro você não pode ter uma tabela (burrona mesmo) de equivalência:
I = 1
II = 2
...
C = 100
Se o máximo é 100, basta converter, somar e voltar para os romanos.
Desculpe meter a colher...
Mas, consideremos o seguinte:
é possÃvel que a quantidade de alternativas não seja tão grande.
Se isso é verdadeiro você não pode ter uma tabela (burrona mesmo) de equivalência:
I = 1
II = 2
...
C = 100
Se o máximo é 100, basta converter, somar e voltar para os romanos.
Como transformar isso em numa consulta SQL,conforme acima ?
Eureka!!!
Achei esse programa em JAVA:
Pena que não está em VB e faça o caminho inverso (Arábico para Romano) mas é um começo, certo?
Achei esse programa em JAVA:
/*-----------------------------------------------------------------------*/
/* Lê um número inteiro, positivo, menor que 4000 e escreve-o usando */
/* algarismos romanos. */
/* Francisco A. S. Grossi */
/*-----------------------------------------------------------------------*/
#include <stdio.h>
void main() {
int numero,quociente,resto,i,j,k,base;
char romanos[] = "CMDXCLIXV";
printf("Entre um número inteiro, positivo, menor que 4000: ");
scanf("%d",&numero);
while (numero > 0 && numero < 4000) {
base = 1000;
quociente = numero / base;
resto = numero % base;
printf("Número em algarismos romanos = ");
for (i=1; i <= quociente; i++) printf("M");
for (k=0; k<9; k+=3) {
base /= 10;
quociente = resto / base;
resto = resto % base;
switch (quociente) {
case 9: printf("%c%c",romanos[k],romanos[k+1]); break;
case 4: printf("%c%c",romanos[k],romanos[k+2]); break;
case 8: case 7: case 6: case 5: printf("%c",romanos[k+2]);
case 3: case 2: case 1: case 0:
for (i=1; i <= quociente%5; i++) printf("%c",romanos[k]);
break;
}
}
printf("
Entre um número inteiro, positivo, menor que 4000: ");
scanf("%d",&numero);
}
}
Pena que não está em VB e faça o caminho inverso (Arábico para Romano) mas é um começo, certo?
Conheço essa função que segue abaixo. Foi o Lion que me passou:
Espqro que ajude.
Public Function Roman(argNumber As Long) As String
Dim WorkingNumber As Long
WorkingNumber = argNumber
If WorkingNumber < 0 Then WorkingNumber = WorkingNumber * -1
If WorkingNumber = 0 Then Exit Function
Const NumNumerals As Integer = 6
Dim Numeral(NumNumerals) As String
Dim Value(NumNumerals) As Long
Numeral(0) = "I": Value(0) = "1"
Numeral(1) = "V": Value(1) = "5"
Numeral(2) = "X": Value(2) = "10"
Numeral(3) = "L": Value(3) = "50"
Numeral(4) = "C": Value(4) = "100"
Numeral(5) = "D": Value(5) = "500"
Numeral(6) = "M": Value(6) = "1000"
Dim i As Integer
Dim j As Integer
Dim OutputString As String
OutputString = ""
Dim CombinedValue As Long
Dim CombinedNumeral As String
Dim FinishedLoop As Boolean
Do
For j = NumNumerals To 0 Step -1
Do
FinishedLoop = True
If WorkingNumber >= Value(j) Then
WorkingNumber = WorkingNumber - Value(j)
OutputString = OutputString & Numeral(j)
FinishedLoop = False
End If
Loop Until FinishedLoop
If (j > 0) Then
For i = 0 To (Int((j - 1) / 2) * 2) Step 1
CombinedNumeral = Numeral(i) & Numeral(j)
CombinedValue = Value(j) - Value(i)
If WorkingNumber >= CombinedValue Then
If CombinedValue <> Value(i) Then
WorkingNumber = WorkingNumber - CombinedValue
OutputString = OutputString & CombinedNumeral
End If
End If
Next
End If
Next
Loop Until WorkingNumber = 0
Roman = OutputString
End Function
Espqro que ajude.
Segue um código que converti de Javascript para ASP, que você pode converter para VB.
Daà segue como citado, vc usa número naturais para guardar na base de dados e converte em Romanos para exibir para o cliente.
Response.write NumRomanos(1002)
%>[/c]
Até mais,
Guardião
Daà segue como citado, vc usa número naturais para guardar na base de dados e converte em Romanos para exibir para o cliente.
<%
[c]Function NumRomanos(pNum)
Dim arrUni, arrDez, arrCem, arrMil
Dim numUni, numDez, numCem, numMil
arrUni = Array("","I","II","III","IV","V","VI","VII","VIII","IX")
arrDez = Array("","X","XX","XXX","XL","L","LX","LXX","LXXX","XC")
arrCem = Array("","C","CC","CCC","CD","D","DC","DCC","DCCC","CM")
arrMil = Array("","M")
If Not IsNumeric(pNum) Or pNum > 1000 Then
NumRomanos = "Número Inválido"
Exit Function
End If
numUni = (pNum Mod 10)
numDez = (pNum Mod 100)- numUni
numCem = (pNum Mod 1000) - (numDez + numUni)
numMil = pNum - (numCem + numDez + numUni)
NumRomanos = Trim( arrMil(numMil/1000) & arrCem(numCem/100) & arrDez(numDez/10) & arrUni(numUni) )
End Function
Response.write NumRomanos(1002)
%>[/c]
Até mais,
Guardião
Pessoal só uma questão como colocaria essas funções dentro da minha consulta SQL! Valeu,abraço.
Eu embarquei no tÃtulo
Só agora vi que não é nada disso - você nem precisa converter, muito menos SOMAR. Você só precisa da CONTAGEM, tipo:
Também fico com a impressão de que você estará lendo um arquivo de "ocorrências" onde só estarão registrados os casos acontecidos no perÃodo, ou seja, códigos com ocorrência zero não existirão no arquivo.
Se isso é verdadeiro, não vejo como resolver apenas com SQL - penso que você precisará de uma tabela com TODAS as ocorrências possÃveis e cirar consulta(s) para buscar as acontecidas no perÃodo. E vai ter de juntar as duas coisas.
CONVERTER Nº ROMANO
e no inÃcio da sua consulta uma rotina que somasse nº romanos
- isso me fez pensar em algo do tipo XV+V=XX ou 15+5=20.Só agora vi que não é nada disso - você nem precisa converter, muito menos SOMAR. Você só precisa da CONTAGEM, tipo:
I = 30 ocorrências
II = 0 ocorrências
III = 5 ocorrências
...
XXX = 12 ocorrências
XXXI = 6 ocorrências
XXXII = 6 ocorrências
XXXIII = 6 ocorrências
Também fico com a impressão de que você estará lendo um arquivo de "ocorrências" onde só estarão registrados os casos acontecidos no perÃodo, ou seja, códigos com ocorrência zero não existirão no arquivo.
Se isso é verdadeiro, não vejo como resolver apenas com SQL - penso que você precisará de uma tabela com TODAS as ocorrências possÃveis e cirar consulta(s) para buscar as acontecidas no perÃodo. E vai ter de juntar as duas coisas.
Pessoal me ajudem aà colocar algumas dessas funções na minha consulta,abraço
Tópico encerrado , respostas não são mais permitidas