SISTEMA EXPERTO
<%
IDENTIFICADOR_HISTORIA_ACTUAL = session("HISTORIA_ACTUAL")
dim NSintoma
NSintoma = 0
redim Sintoma(0)
dim NPosiblePatologia
NPosiblePatologia = 0
redim PosiblePatologia(0)
redim OrdenadaPosiblePatologia(0)
redim PesoPosiblePatologia(0,2)
'**** Prepara la conexion
Const AdopenKeyset = 1
Const adLockOptimistic = 3
Set rs1 = CreateObject("ADODB.Recordset")
rs1.CursorType = AdopenKeyset
rs1.LockType = adLockOptimistic
'********************************************
'**** Busca los sintomas del caso actual
'********************************************
SQL= "SELECT nombre_sintoma FROM historia_sintoma WHERE identificador_historia = " + cstr(IDENTIFICADOR_HISTORIA_ACTUAL)
'Set rs1 = CreateObject("ADODB.Recordset")
'rs1.CursorType = AdopenKeyset
'rs1.LockType = adLockOptimistic
'RESPONSE.WRITE SQL + " "
rs1.Open SQL, "DSN=SEX"
J=0
while rs1.eof = false
ReDim Preserve Sintoma(J)
Sintoma(J) = rs1.fields(0)
NSintoma = NSintoma + 1
rs1.movenext
J=J+1
wend
rs1.Close
'*******************************************************
'**** Busca las posibles patologias del caso actual
'*******************************************************
SQL= "SELECT DISTINCT nombre_patologia FROM diagnostico_base"
SQL = SQL + " WHERE nombre_sintoma IN ('"
FOR I = 0 TO NSintoma - 1
SQL = SQL + Sintoma(I)
IF I < NSintoma - 1 THEN
SQL = SQL + "','"
END IF
NEXT
SQL = SQL + "') ORDER BY nombre_patologia ASC"
'Set rs1 = CreateObject("ADODB.Recordset")
'rs1.CursorType = AdopenKeyset
'rs1.LockType = adLockOptimistic
rs1.Open SQL, "DSN=SEX"
J=0
while rs1.eof = false
NPosiblePatologia = NPosiblePatologia + 1
redim OrdenadaPosiblePatologia(J)
redim PesoPosiblePatologia(J,0)
redim preserve PosiblePatologia(J)
PosiblePatologia(J) = rs1.fields(0)
rs1.movenext
J=J+1
wend
rs1.Close
'response.write "El numero de posibles patologias a partir de los sintomas es =" + cstr(j) + " "
'****************************************************************************************
'**** BUSCA LOS IDENTIFICADOR_SUBPRUEBA REALIZADAS AL PACIENTE
'****************************************************************************************
SQL = "SELECT SUBPRUEBA.IDENTIFICADOR_SUBPRUEBA FROM SUBPRUEBA INNER JOIN (RESULTADO INNER JOIN HISTORIA_RESULTADO ON RESULTADO.IDENTIFICADOR_RESULTADO = HISTORIA_RESULTADO.IDENTIFICADOR_RESULTADO) ON SUBPRUEBA.IDENTIFICADOR_SUBPRUEBA = RESULTADO.IDENTIFICADOR_SUBPRUEBA "
SQL = SQL + " WHERE HISTORIA_RESULTADO.IDENTIFICADOR_HISTORIA = " + CSTR(IDENTIFICADOR_HISTORIA_ACTUAL)
'Set rs1 = CreateObject("ADODB.Recordset")
'rs1.CursorType = AdopenKeyset
'rs1.LockType = adLockOptimistic
rs1.Open SQL, "DSN=SEX"
REDIM PruebasRealizadas(0)
NPruebasRealizadas = 0
WHILE rs1.eof = false
REDIM preserve PruebasRealizadas(NPruebasRealizadas)
PruebasRealizadas(NPruebasRealizadas) = rs1.fields(0)
NPruebasRealizadas = NPruebasRealizadas + 1
'response.write cstr(rs1.fields(0)) + " "
rs1.movenext
wend
rs1.close
'****************************************************************************************
'**** BUSCA LOS IDENTIFICADOR_RESULTADO REALIZADAS AL PACIENTE
'****************************************************************************************
SQL = "SELECT identificador_resultado FROM HISTORIA_RESULTADO WHERE HISTORIA_RESULTADO.IDENTIFICADOR_HISTORIA = " + CSTR(IDENTIFICADOR_HISTORIA_ACTUAL)
'Set rs1 = CreateObject("ADODB.Recordset")
'rs1.CursorType = AdopenKeyset
'rs1.LockType = adLockOptimistic
rs1.Open SQL, "DSN=SEX"
REDIM IdentificadoresPruebasRealizadas(0)
NIdentificadoresPruebasRealizadas = 0
WHILE rs1.eof = false
REDIM preserve IdentificadoresPruebasRealizadas(NIdentificadoresPruebasRealizadas)
IdentificadoresPruebasRealizadas(NIdentificadoresPruebasRealizadas) = rs1.fields(0)
NIdentificadoresPruebasRealizadas = NIdentificadoresPruebasRealizadas + 1
'response.write cstr(rs1.fields(0)) + " "
rs1.movenext
wend
rs1.close
'****************************************************************************************
'**** BUSCA LOS IDENTIFICADOR_RESULTADO CONTRARIOS A LOS DEL PACIENTE Y DISTINTOS DE 1 Y 4
'****************************************************************************************
IF NPruebasRealizadas > 0 THEN
SQL= "SELECT RESULTADO.IDENTIFICADOR_RESULTADO FROM SUBPRUEBA INNER JOIN RESULTADO ON SUBPRUEBA.IDENTIFICADOR_SUBPRUEBA = RESULTADO.IDENTIFICADOR_SUBPRUEBA "
SQL = SQL + " WHERE RESULTADO.VALOR_RESULTADO NOT IN (0,1,4) "
SQL = SQL + " AND RESULTADO.IDENTIFICADOR_RESULTADO NOT IN ("
FOR I = 0 TO NIdentificadoresPruebasRealizadas - 1
SQL = SQL + cstr(IdentificadoresPruebasRealizadas(I))
IF I < NIdentificadoresPruebasRealizadas - 1 THEN
SQL = SQL + ","
END IF
NEXT
SQL = SQL + ")"
SQL = SQL + " AND SUBPRUEBA.IDENTIFICADOR_SUBPRUEBA IN ("
FOR I = 0 TO NPruebasRealizadas - 1
SQL = SQL + cstr(PruebasRealizadas(I))
IF I < NPruebasRealizadas - 1 THEN
SQL = SQL + ","
END IF
NEXT
SQL = SQL + ")"
'response.write " " + sql + " "
'Set rs1 = CreateObject("ADODB.Recordset")
'rs1.CursorType = AdopenKeyset
'rs1.LockType = adLockOptimistic
rs1.Open SQL, "DSN=SEX"
'response.write "Los identificadores de los resultados contrarios son: "
REDIM ResultadosContrarios(0)
NResultadosContrarios = 0
WHILE rs1.eof = false
REDIM preserve ResultadosContrarios(NResultadosContrarios)
ResultadosContrarios(NResultadosContrarios) = rs1.fields(0)
NResultadosContrarios = NResultadosContrarios + 1
'response.write cstr(rs1.fields(0)) + " "
rs1.movenext
wend
rs1.close
END IF
'response.write "El numero de identificadores de resultados contrarios es =" + cstr(NResultadosContrarios) + " "
'****************************************************************************************
'**** BUSCA LAS POSIBLES PATOLOGIAS POSIBLES PERO QUE CONTIENEN ALGUN RESULTADO DE PRUEBA
'**** CONTRARIO A LOS REALIZADOS AL PACIENTE
'****************************************************************************************
SQL= "SELECT DISTINCT NOMBRE_PATOLOGIA FROM DIAGNOSTICO_RESULTADO "
SQL = SQL + " WHERE "
SQL = SQL + " NOMBRE_PATOLOGIA IN ('"
FOR I = 0 TO NPosiblePatologia - 1
SQL = SQL + cstr(PosiblePatologia(I))
IF I < NPosiblePatologia - 1 THEN
SQL = SQL + "','"
END IF
NEXT
SQL = SQL + "')"
IF NResultadosContrarios > 0 THEN
SQL = SQL + " AND IDENTIFICADOR_RESULTADO IN ("
FOR I = 0 TO NResultadosContrarios - 1
SQL = SQL + cstr(ResultadosContrarios(I))
IF I < NResultadosContrarios - 1 THEN
SQL = SQL + ","
END IF
NEXT
SQL = SQL + ")"
'response.write " " + sql + " "
Set rs1 = CreateObject("ADODB.Recordset")
'rs1.CursorType = AdopenKeyset
'rs1.LockType = adLockOptimistic
rs1.Open SQL, "DSN=SEX"
'response.write "LAS POSIBLES PATOLOGIAS A DESCARTAR SON:" + " "
NPAD=0
redim PatologiaADescartar(0)
WHILE rs1.eof = false
redim preserve PatologiaADescartar(NPAD)
PatologiaADescartar(NPAD) = rs1.fields(0)
'response.write cstr(rs1.fields(0)) + " "
NPAD = NPAD + 1
rs1.movenext
wend
rs1.close
'response.write "EL NUEMRO DE POSIBLES PATOLOGIAS A DESCARTAR =" + CSTR(NPAD) + " "
END IF
'****************************************************************************************
'**** BUSCA LAS POSIBLES PATOLOGIAS TENIENDO EN CUENTA LOS RESULTADOS DE LAS PRUEBAS
'****************************************************************************************
SQL= "SELECT DISTINCT NOMBRE_PATOLOGIA FROM DIAGNOSTICO_RESULTADO "
SQL = SQL + " WHERE "
SQL = SQL + " NOMBRE_PATOLOGIA IN ('"
FOR I = 0 TO NPosiblePatologia - 1
SQL = SQL + cstr(PosiblePatologia(I))
IF I < NPosiblePatologia - 1 THEN
SQL = SQL + "','"
END IF
NEXT
SQL = SQL + "')"
IF NResultadosContrarios > 0 THEN
SQL = SQL + " AND NOMBRE_PATOLOGIA NOT IN ('"
FOR I = 0 TO NPAD - 1
SQL = SQL + PatologiaADescartar(I)
IF I < NPAD - 1 THEN
SQL = SQL + "','"
END IF
NEXT
SQL = SQL + "')"
'response.write "
" + sql + " "
'Set rs1 = CreateObject("ADODB.Recordset")
'rs1.CursorType = AdopenKeyset
'rs1.LockType = adLockOptimistic
rs1.Open SQL, "DSN=SEX"
'response.write "LAS POSIBLES PATOLOGIAS DESPUES DEL DESCARTE SON:" + " "
NPP=0
redim PosiblePatologia(0)
WHILE rs1.eof = false
redim OrdenadaPosiblePatologia(NPP)
redim preserve PosiblePatologia(NPP)
PosiblePatologia(NPP) = rs1.fields(0)
'response.write cstr(rs1.fields(0)) + " "
NPP=NPP+1
rs1.movenext
wend
rs1.close
redim PesoPosiblePatologia(NPP,2)
'response.write "EL NUEMRO DE POSIBLES PATOLOGIAS SON=" + CSTR(NPP) + " "
NPosiblePatologia = NPP
END IF
'********************************************
'**** Empieza la orientacion (PROBABILIDADES)
'********************************************
For Contador_J=0 to NPosiblePatologia - 1
PesoRelativoPatologia=0
PesoPatologiaJSintomaI=0
PesoParcialPatologiaJSintomaI=0
ContadorBase=0
FOR Contador_I=0 TO NSintoma - 1
SQL= "SELECT Contador_Base FROM Diagnostico_Base WHERE Nombre_Patologia like '" + PosiblePatologia(Contador_J) + "' and Nombre_Sintoma like '" + Sintoma(Contador_I) + "'"
'Set rs1 = CreateObject("ADODB.Recordset")
'rs1.CursorType = AdopenKeyset
'rs1.LockType = adLockOptimistic
rs1.Open SQL, "DSN=SEX"
IF rs1.bof=false and rs1.eof=false THEN
ContadorBase= rs1.Fields(0)
rs1.Close
SQL= "SELECT sum(Contador_Base) as Suma FROM Diagnostico_Base WHERE Nombre_Sintoma like '" + Sintoma(Contador_I) + "'"
'Set rs1 = CreateObject("ADODB.Recordset")
'rs1.CursorType = AdopenKeyset
'rs1.LockType = adLockOptimistic
rs1.Open SQL, "DSN=SEX"
PesoParcialPatologiaJSintomaI=ContadorBase/rs1.Fields(0)
rs1.Close
SQL= "SELECT sum(Contador_Base) as Suma FROM Diagnostico_Base WHERE Nombre_Patologia like '" + PosiblePatologia(Contador_J) + "'"
'Set rs1 = CreateObject("ADODB.Recordset")
'rs1.CursorType = AdopenKeyset
'rs1.LockType = adLockOptimistic
rs1.Open SQL, "DSN=SEX"
PesoPatologiaJSintomaI=(PesoParcialPatologiaJSintomaI*ContadorBase)/rs1.Fields(0)
PesoRelativoPatologia=PesoRelativoPatologia+PesoPatologiaJSintomaI
PesoPosiblePatologia(Contador_J,0)=PesoRelativoPatologia
END IF
rs1.close
NEXT
Next
Dim Suma
Suma=0
For I=0 to NPosiblePatologia - 1
Suma = Suma + PesoPosiblePatologia(I,0)
Next
For I=0 to NPosiblePatologia - 1
PesoPosiblePatologia(I,0) = Clng(PesoPosiblePatologia(I,0)*10000/Suma ) /100
Next
'****************************************************************
'****************************************************************
'****************************************************************
' Empieza a ponderar las patolog¡as por sus pruebas
'****************************************************************
'****************************************************************
'****************************************************************
'****************************************************************
'**** Busca los resultados de las pruebas realizadas al paciente
'****************************************************************
SQL= "SELECT IDENTIFICADOR_RESULTADO FROM HISTORIA_RESULTADO WHERE IDENTIFICADOR_HISTORIA = " + cstr(IDENTIFICADOR_HISTORIA_ACTUAL)
'Set rs1 = CreateObject("ADODB.Recordset")
'rs1.CursorType = AdopenKeyset
'rs1.LockType = adLockOptimistic
rs1.Open SQL, "DSN=SEX"
NResultadosPruebas = 0
ReDim ResultadosPruebas(0)
while rs1.eof = false
NResultadosPruebas = NResultadosPruebas + 1
ReDim Preserve ResultadosPruebas(NResultadosPruebas)
ResultadosPruebas(NResultadosPruebas-1) = rs1.fields(0)
'response.write Cstr(ResultadosPruebas(NResultadosPruebas-1)) + " "
rs1.movenext
wend
rs1.Close
'response.write cstr(NResultadosPruebas) + " "
'****************************************************************************************
'**** Empieza la orientacion por medio de los resultados de las pruebas (PROBABILIDADES)
'****************************************************************************************
FOR Contador_J=0 TO NPosiblePatologia - 1
SQL= "SELECT Count(NOMBRE_PATOLOGIA) FROM DIAGNOSTICO_RESULTADO WHERE IDENTIFICADOR_RESULTADO IN ("
FOR Contador_I=0 TO NResultadosPruebas - 1
SQL = SQL + cstr(ResultadosPruebas(Contador_I))
IF I < NResultadosPruebas - 1 THEN
SQL = SQL + ","
END IF
NEXT
SQL = SQL + ") AND NOMBRE_PATOLOGIA IN ('"
FOR IJK=0 TO NPosiblePatologia - 1
SQL = SQL + cstr(PosiblePatologia(IJK))
IF I < NPosiblePatologia - 1 THEN
SQL = SQL + "','"
END IF
NEXT
SQL = SQL + "')"
'Set rs1 = CreateObject("ADODB.Recordset")
'rs1.CursorType = AdopenKeyset
'rs1.LockType = adLockOptimistic
rs1.Open SQL, "DSN=SEX"
IF rs1.Fields(0) <> 0 AND NResultadosPruebas <> 0 THEN
PesoPosiblePatologia(Contador_J,1) = Cint(rs1.Fields(0)*10000/NResultadosPruebas)/100
ELSE
PesoPosiblePatologia(Contador_J,1) = 0
END IF
'RESPONSE.WRITE "El n£mero de resultados de pruebas coincidentes con la patologia es = " + CSTR(rs1.Fields(0)) + " "
'RESPONSE.WRITE "El n£mero de resultados de pruebas realizadas al paciente es = " + CSTR(NResultadosPruebas) + " "
'RESPONSE.WRITE CSTR(PesoPosiblePatologia(Contador_J,1)) + " "
'RESPONSE.WRITE CSTR(PesoPosiblePatologia(Contador_J,0)) + " "
'RESPONSE.WRITE cstr(Contador_J) + " " + CSTR(PosiblePatologia(Contador_J)) + " "
rs1.close
NEXT
'****************************************************************
'****************************************************************
'****************************************************************
' Empieza a ordenar las patolog¡as por sus pesos
Redim PatologiasOrdenadas(NPosiblePatologia,2)
dim Elegida
FOR Vez=0 TO NPosiblePatologia - 1
PatologiasOrdenadas(Vez,1) = PosiblePatologia(0)
PatologiasOrdenadas(Vez,2) = (PesoPosiblePatologia(0,0)+PesoPosiblePatologia(0,1))/2
Elegida=0
FOR A=1 TO NPosiblePatologia - 1
IF (PesoPosiblePatologia(A,0)+PesoPosiblePatologia(A,1))/2 > PatologiasOrdenadas(Vez,2) THEN
PatologiasOrdenadas(Vez,1)=PosiblePatologia(A)
PatologiasOrdenadas(Vez,2)=(PesoPosiblePatologia(A,0)+PesoPosiblePatologia(A,1))/2
Elegida=A
END IF
NEXT
PesoPosiblePatologia(Elegida,0)=0
PesoPosiblePatologia(Elegida,1)=0
NEXT
SUMA = 0
FOR I=0 TO Ubound(PatologiasOrdenadas) - 1
SUMA = SUMA + PatologiasOrdenadas(I,2)
NEXT
FOR I=0 TO Ubound(PatologiasOrdenadas) - 1
PatologiasOrdenadas(I,2) = CLNG(PatologiasOrdenadas(I,2)*10000/SUMA)/100
NEXT
FOR I=0 TO Ubound(PatologiasOrdenadas) - 1
SUMA = SUMA + PatologiasOrdenadas(I,2)
NEXT
'***************************************************************************
'***************************************************************************
'***************************************************************************
'***************************************************************************
'***************************************************************************
' Empieza a presentar los pesos obtenidos
Response.write "
ORIENTACION TIPO IV
"
Response.write "
Posibles patologias ordenadas y con sus pesos relativos
"
if Ubound(PatologiasOrdenadas) > 0 then
Response.write "
"
Response.write "
Patologia
Pesos relativos( % )
"
For I=0 to NPosiblePatologia - 1
Response.write "
" + PatologiasOrdenadas(I,1) + "
" + Cstr(PatologiasOrdenadas(I,2)) + "( % )
"
Next
Response.write "
"
Response.Write "
Numero de posibles patologias = " + cstr(NPosiblePatologia) + " "
else
Response.Write "
No existen patologías asociadas con los síntomas y resultados de pruebas realizadas. "
end if
'session("NumPatologiasFiltradas")=NPosiblePatologia
'session("PatologiasFiltradas")=PosiblePatologia
%>
e-REdING. Biblioteca de la Escuela Superior de Ingenieros de Sevilla.