Olá David,
Primeiro, você deve fazer tudo isso em um relatório primeiro. Abra o Designer, abra um de seus relatórios, clique na opção Database e depois em Set Location.....
Selecione o Cliente, preencha as informações de login, uma vez que a conexão seja estabelecida, clique na nova fonte de dados e depois na antiga fonte de dados e então no botão Mapear. Se houver problemas de mapeamento de tipos de campo, uma interface de mapeamento será aberta e você terá que mapear os campos individualmente.
Defina a localização para cada fonte de dados listada, se você tiver um sub-relatório, faça o mesmo.
Agora clique em Database... e depois em Verify, isso atualizará as informações da tabela no relatório com as novas informações da tabela selecionada.
Agora use o mesmo fluxo de trabalho no SDK. Neste caso, você precisará usar ReplaceConnection(OldConn, NewConn, DoNotVerify) para que as informações do banco de dados sejam atualizadas corretamente, mesmo ao usar um Command.
Ambas as chamadas são uma configuração global, então valide cada tabela na coleção, não é necessário chamá-las em loop para definir a localização, uma vez que esse loop seja concluído, faça as chamadas apenas uma vez. As conexões de sub-relatórios também devem ser configuradas, então faça essas chamadas.
E você realmente precisa estar conectado ao banco de dados, não pode simplesmente chamá-las e esperar que a conexão funcione ou verifique as informações da tabela.
O fluxo de trabalho seria o seguinte:
Abra o relatório
Obtenha o SQL do objeto Command
Altere o SQL e configure-o para os relatórios principais e os sub-relatórios
Agora configure as propriedades de conexão para fazer login.
Se o relatório estiver utilizando um Procedimento Armazenado, configure primeiro os parâmetros do SP antes de fazer login.
Caso contrário, defina os valores de qualquer parâmetro do CR que precise ser alterado ou que não tenha valores padrão salvos
Agora faça login no BD
Verifique a conectividade aqui, isso não verifica as informações dos dados do relatório, apenas testa se a informação de conexão funciona.
Defina os valores padrão dos parâmetros, se necessário.
Agora SetLocation()
Agora verifique o banco de dados.
E agora você pode salvar o relatório, se estiver usando RAS para atualizar alguma parte, então precisa usar o objeto ReportClientDocument ao salvar. Ele tem as informações atualizadas. O ClientDocument pode não tê-las, algumas propriedades básicas podem ser salvas, mas para alterar a fonte de BD, você precisa usar o objeto RCD.
Apenas para esclarecer, você está usando Java ou .NET?
Não tenho exemplos, mas talvez você possa encontrar alguns aqui:
https://wiki.scn.sap.com/wiki/display/BOBJ/Java+%28Crystal+Reports+for+Eclipse%29+SDK
E mais aqui:
https://wiki.scn.sap.com/wiki/display/BOBJ/Java+SDK
Para exemplos do .NET, veja aqui, escrevi 2 aplicativos de teste, um para Parâmetros/Login e outro para Impressão:
https://wiki.scn.sap.com/wiki/display/BOBJ/Crystal+Reports%2C+Developer+for+Visual+Studio+Downloads
Don