<%@ LANGUAGE = "VBScript" %> 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_simulado" 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_Simulado FROM diagnostico_simulado 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_Simulado) as Suma FROM diagnostico_simulado 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_Simulado) as Suma FROM diagnostico_simulado 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 V

" Response.write "
Posibles patologias ordenadas y con sus pesos relativos

" if Ubound(PatologiasOrdenadas) > 0 then Response.write "" Response.write "" For I=0 to NPosiblePatologia - 1 Response.write "" Next Response.write "
Patologia
Pesos relativos( % )
" + PatologiasOrdenadas(I,1) + "
" + Cstr(PatologiasOrdenadas(I,2)) + "( % )
" 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.


SISTEMA EXPERTO APLICADO A LA ATENCIÓN PRIMARIA MÉDICA. AYUDA AL DIAGNÓSTICO

: Calle Suarez, Marcos
: Ingeniería Organización
Contenido del proyecto: