Hola foro,
Muy respetable tu forma de trabajar pero te recomendaria que utilizaras los procedimientos almacenados para realizar consultas a la base de datos que no son posibles directamente con la clausula select, para hacer calculos y operaciones donde intervienen muchas tablas, para informes cross-tab (donde se trasponen las filas por las columnas) y en general para casos muy especiales.
Voy acolocar un ejemplo, en un sistema que efectua liquidaciones a 10.000 clientes, si lo hiciera en codigo de Delphi, los datos de todos ellos tendrian que viajar por la red hasta el equipo que esta ejecutando el programa, con un procedimiento almacenado no tiene que viajar datos a ninguna parte y se hace la liquidacion directamente en el equipo (servidor) que contien la base de datos, esta es una de las caracteristicas de las tecnologias cliente/servidor.
Otra cosa, si dicose es la llave primaria pues atrapa el error enviado por el motor en caso de presentarse vioalcion de la llave y listo.
Pero volviendo al origen de tu pregunta, el codigo pasa "derecho" y no hace lo que quieres porque tu segmento de codigo
Código Delphi
[-]
if (not dmTablas.MDOSPExistCPCliente.IsEmpty) then
siempre dara verdadero, esto debido a que el procedimiento almacenado SP_EXIST_CLIENTE retorna en el parametro de salida dicose un valor (nullo o no), lo que debes es preguntar por el contenido del parametro de salida.
Cambia la linea anterior por
Código Delphi
[-]
if (not dmTablas.MDOSPExistCPCliente.ParamByName('DICOSE').IsNull) then
Muchos exitos