CONVERTER N¬šÃ€ŠÂº ROMANOS

LUIS.FLAVIO 27/11/2006 19:09:36
#186607
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.
PAULOOLIVEIRA 27/11/2006 19:33:38
#186611
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

LUIS.FLAVIO 27/11/2006 19:52:24
#186616
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.
USUARIO.EXCLUIDOS 27/11/2006 20:10:01
#186620
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.
LUIS.FLAVIO 27/11/2006 20:12:28
#186621
Como transformar isso em numa consulta SQL,conforme acima ?
USUARIO.EXCLUIDOS 27/11/2006 20:24:54
#186622
Eureka!!!

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?
USUARIO.EXCLUIDOS 27/11/2006 21:09:10
#186627
Conheço essa função que segue abaixo. Foi o Lion que me passou:

 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.
USUARIO.EXCLUIDOS 28/11/2006 02:27:09
#186647
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.

<%
[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
LUIS.FLAVIO 28/11/2006 07:39:53
#186655
Pessoal só uma questão como colocaria essas funções dentro da minha consulta SQL! Valeu,abraço.
USUARIO.EXCLUIDOS 28/11/2006 08:19:29
#186666
Eu embarquei no título
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.
LUIS.FLAVIO 01/12/2006 16:16:44
#187458
Pessoal me ajudem aí colocar algumas dessas funções na minha consulta,abraço
Página 1 de 2 [13 registro(s)]
Tópico encerrado , respostas não são mais permitidas