Path Finder in a 2D Grid Map With Different Terrain Types

     I have been thinking for a while on path finding game algoritms and I can up with one idea witch I want to publish. The goal of my project is when I have a 2 dimensional grid map where squares can have different movement cost, like in Civilization II, to find the shortest way from one point in the map to another. I've used the Breathed First Search Engine. If you are not familiar to this search engine it is better to read about it first because I am not fcusing on it and I assume that you now how it works. You can read about it at the book "Practical Artificial Intelligence Programming in Java" writen by Mark Watson, witch is freely distributed at www.markwatson.com.
     Actually the idea of this 2D grid path finder is to use a third dimension witch have a size equal to the highest movement cost among all terrain types. This helps solving the problem with the different movement cost of the squates. By adding this abstract third dimension it is posible to use the Breadth First Search Engine.
     I this example the movementcost of a terrain type is always the same, no matter from witch square to with are you going (like in Civilization II but I haven't included roads or railroads). For example if you want to go from one square A to another square B with movement cost X (A and B are attached) you must go "up stairs" in the third dimension X - 1 times and then move to square B. But when you step on square B you are again at the lowest floor. So if you want to come back to the previous square A and it have movement cost Y first you must go floor Y and then jump in square A. And now you are again at the lowest floor at square A. When you move from one square to another you go always at the lowest floor. This is the way I handle with different movement costs.
     When you find the path to the goal point it is in 3 dimensions. So you must just project it in the 2D map and that's all you have the shortest path.
     I am sure this is not the best way to code this search engine but this is just the first scratch with no optimisation and so on. If I make a 100x100 randomly generated map it takes on my configuration(400Mhz Pentium II CPU with ASUS P2B MotherBoard on 100 MHz and 256 MB SD RAM on 133 MHz but because of my MB on 100MHz) around 1000 miliseconds (1000 miliseconds = 1 second) to find the shortest path from (1, 1) to (100, 100) witch is pretty good compare to the goTo function in Civilization II witch does not finds the shortest path at all and have made hundrets of gamers angry. This is amazing that nowadays there are so many games with bad path finding.
     This project includes:
1. The PathFinder class witch does the jub.
2. The Map class witch has a generator for a random map in it.
3. The class TerrainType, every square on the map is based on this class.
4. The class TerrainTypes witch is the set of all terrain types used in the map.
5. The class PathFinderTest witch just test the path finder.
To test this project put all files in one directory and run PathFinderTest.java.
Map.java:
import java.util.Vector;
import java.util.Random;
//This class just creates a random map and keeps it. I will not comment on this.
class Map {
  //here is kept the information about the terrain types placed in the map. Where
  //every terrain type has a specific movement cost.
  private int[][] terrain;
  public TerrainTypes terrainTypes;
  private int landMass;
  private int width;
  private int height;
  private int highestMovementCost;
  public Map(int aWidth, int aHeight) {
    width = aWidth;
    height = aHeight;
    terrainTypes = new TerrainTypes();
    highestMovementCost = terrainTypes.getHighestMovementCost();
    terrain = new int[width][height];
    landMass = 0;
    generateRandomMap();
  public void clearGoalAndStartLocFromWater(int sx, int sy, int gx, int gy) {
    terrain[gx][gy] = 0;
    terrain[sx][sy] = 0;
  private void expandWater() {
    int waterConstant = 40;
    int waterExpansion = 2;
    int[][] moreWater = new int[width][height];
    Random randomizer = new Random();
    for (int t = 0; waterExpansion > t; t++) {
      for (int i = 0; i < width; i++) {
        for (int j = 0; j < height; j++) {
          if (i + 1 >= 0 && j >= 0 && i + 1 < width && j < height) {
            if (terrain[i + 1][j] != 4) {
              if (randomizer.nextInt(waterConstant) == 0)
                moreWater[i + 1][j] = 1;
          if (i + 1 >= 0 && j - 1 >= 0 && i + 1 < width && j - 1 < height) {
            if (terrain[i + 1][j - 1] != 4) {
              if (randomizer.nextInt(waterConstant) == 0)
                moreWater[i + 1][j - 1] = 1;
          if (i >= 0 && j - 1 >= 0 && i < width && j - 1 < height) {
            if (terrain[i][j - 1] != 4) {
              if (randomizer.nextInt(waterConstant) == 0)
                moreWater[i][j - 1] = 1;
          if (i - 1 >= 0 && j - 1 >= 0 && i - 1 < width && j - 1 < height) {
            if (terrain[i - 1][j - 1] != 4) {
              if (randomizer.nextInt(waterConstant) == 0)
                moreWater[i - 1][j - 1] = 1;
          if (i - 1 >= 0 && j >= 0 && i - 1 < width && j < height) {
            if (terrain[i - 1][j] != 4) {
              if (randomizer.nextInt(waterConstant) == 0)
                moreWater[i - 1][j] = 1;
          if (i - 1 >= 0 && j + 1 >= 0 && i - 1 < width && j + 1 < height) {
            if (terrain[i - 1][j + 1] != 4) {
              if (randomizer.nextInt(waterConstant) == 0)
                moreWater[i - 1][j + 1] = 1;
          if (i >= 0 && j + 1 >= 0 && i < width && j + 1 < height) {
            if (terrain[i][j + 1] != 4) {
              if (randomizer.nextInt(waterConstant) == 0)
                moreWater[i][j + 1] = 1;
          if (i + 1 >= 0 && j + 1 >= 0 && i + 1 < width && j + 1 < height) {
            if (terrain[i + 1][j + 1] != 4) {
              if (randomizer.nextInt(waterConstant) == 0)
                moreWater[i + 1][j + 1] = 1;
    for (int i = 0; i < width; i++) {
      for (int j = 0; j < height; j++) {
        if (moreWater[i][j] == 1) {
          terrain[i][j] = 4;
  private void generateRandomMap() {
    Random randomizer = new Random();
    for (int i = 0; i < width; i++) {
      for (int j = 0; j < height; j++) {
        if (randomizer.nextInt(3) == 1)
          terrain[i][j] = 0;
        else if (randomizer.nextInt(2) == 1)
          terrain[i][j] = 1;
        else if (randomizer.nextInt(2) == 1)
          terrain[i][j] = 3;
        else if (randomizer.nextInt(2) == 1)
          terrain[i][j] = 2;
        else if (randomizer.nextInt(2) == 1)
          terrain[i][j] = 2;
        else if (randomizer.nextInt(2) == 1)
          terrain[i][j] = 1;
        else if (randomizer.nextInt(2) == 1)
          terrain[i][j] = 3;
        else
          terrain[i][j] = randomizer.nextInt(5);
    expandWater();
    for (int i = 0; i < width; i++) {
      for (int j = 0; j < height; j++) {
        if (terrain[i][j] != 0)
          landMass++;
  public int getMapHeight() {
    return height;
  public int getMapWidth() {
    return width;
  public int getSquareID(int x, int y) {
    return terrain[x][y];
  public int getSquareMovementCost(int x, int y) {
    return terrainTypes.getMovementCost(terrain[x][y]);
}PathFinder.java:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Vector;
public class PathFinder {
  private BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
  //The array t3D[][] represents the 2D square map where t3D.leght = map width
  //and t3D[x].lenght = map width (-1 < x < t3D.leght). The third dimension
  //is refered to the square's movement cost, witch is definite by terrain.
  //The fourth dimension will be with lenght = 3. When running the search engine
  //(expanding the explored squares) this 3 values will keep the position of
  //the previous square in 3 dimension, witch are width, height and the maximum
  //movement cost among all squares.
  private int[][][][] squares3DReference;
  //Keeps information witch squares are visited.
  private boolean[][][] visitedSquares;
  private Map map;
  //this is the queue used in the Breathed First Seatch.
  private Vector queue3D;
  //Here is saved the shortest path
  private Vector path2D;
  private int highestMovementCost;
  public PathFinder(Map aMap) {
    map = aMap;
    queue3D = new Vector();
    path2D = new Vector();
    squares3DReference = new int[map.getMapWidth()][map.getMapHeight()][][];
    visitedSquares = new boolean[map.getMapWidth()][map.getMapHeight()][];
    highestMovementCost = map.terrainTypes.getHighestMovementCost();
    buildAbstract3DTerrain();
  private void buildAbstract3DTerrain() {
    for (int x = 0; x < map.getMapWidth(); x++) {
      for (int y = 0; y <map.getMapHeight(); y++) {
        int movementCost = map.terrainTypes.getMovementCost(map.getSquareID(x, y));
        if ( movementCost > 0) {
          visitedSquares[x][y] = new boolean[highestMovementCost];
          squares3DReference[x][y] = new int[highestMovementCost][3];
          for (int z = 0; z < highestMovementCost; z++) {
            for (int t = 0; t < 3; t++) {
              squares3DReference[x][y][z][t] = -1;
  private boolean isMoveValid(int x, int y, int z, int x2, int y2, int z2) {
    if ( x < 0 || y < 0 || z < 0 || x2 < 0 || y2 < 0 || z2 < 0 || x >= map.getMapWidth() || y >= map.getMapHeight() || z >= highestMovementCost ||  x2 >= map.getMapWidth() || y2 >= map.getMapHeight() || z2 >= highestMovementCost)
      return false;
    if (map.terrainTypes.getMovementCost(map.getSquareID(x2, y2)) < 1)
      return false;
    if (visitedSquares[x2][y2][z2])
      return false;
    if (x == x2 && y == y2)
      return true;
    else {
      if (z == map.terrainTypes.getMovementCost(map.getSquareID(x2, y2)) - 1)
        return true;
      else
        return false;
  private void clearPreviousSearchData() {
    queue3D.clear();
    path2D.clear();
    for (int x = 0; x < map.getMapWidth(); x++) {
      for (int y = 0; y < map.getMapHeight(); y++) {
        if (squares3DReference[x][y] != null) {
          for (int z = 0; z < highestMovementCost; z++) {
            visitedSquares[x][y][z] = false;
            for (int t = 0; t < 3; t++) {
              squares3DReference[x][y][z][t] = -1;
  private Vector copyPath2D() {
    Vector path = new Vector();
    for (int i = 0; i < path2D.size(); i++) {
      path.add(path2D.get(i));
    return path;
  public Vector findPath(int sX, int sY, int gX, int gY) {
    int head = 0;
    int tail = 0;
    int x = sX;
    int y = sY;
    int z = 0;
    visitedSquares[x][y][z] = true;
    mainLoop: {
      while (tail <= head) {
        int[][] moves = getPosibleMoves(x, y, z);
        for (int i = 0; i < 9; i++) {
          if (moves[i] != null) {
            squares3DReference[moves[0]][moves[i][1]][moves[i][2]][0] = x;
squares3DReference[moves[i][0]][moves[i][1]][moves[i][2]][1] = y;
squares3DReference[moves[i][0]][moves[i][1]][moves[i][2]][2] = z;
queue3D.add(moves[i]);
if (moves[i][0] == gX && moves[i][1] == gY) {
break mainLoop;
visitedSquares[moves[i][0]][moves[i][1]][moves[i][2]] = true;
head++;
if (queue3D.size() == 0 || queue3D.size() == tail)
break mainLoop;
int[] nextInQueue = ((int[]) queue3D.get(tail));
x = nextInQueue[0];
y = nextInQueue[1];
z = nextInQueue[2];
tail++;
if (squares3DReference[gX][gY][0][0] == -1) {
clearPreviousSearchData();
return path2D;
fillpath2D(sX, sY, gX, gY);
Vector path = copyPath2D();
clearPreviousSearchData();
return path;
private int[][] getPosibleMoves(int x, int y, int z) {
int[][] moves = new int[9][3];
if (isMoveValid(x, y, z, x + 1, y, 0)) {
moves[0][0] = x + 1;
moves[0][1] = y;
moves[0][2] = 0;
else
moves[0] = null;
if (isMoveValid(x, y, z, x + 1, y - 1, 0)) {
moves[1][0] = x + 1;
moves[1][1] = y - 1;
moves[1][2] = 0;
else
moves[1] = null;
if (isMoveValid(x, y, z, x, y - 1, 0)) {
moves[2][0] = x;
moves[2][1] = y - 1;
moves[2][2] = 0;
else
moves[2] = null;
if (isMoveValid(x, y, z, x - 1, y - 1, 0)) {
moves[3][0] = x - 1;
moves[3][1] = y - 1;
moves[3][2] = 0;
else
moves[3] = null;
if (isMoveValid(x, y, z, x - 1, y, 0)) {
moves[4][0] = x - 1;
moves[4][1] = y;
moves[4][2] = 0;
else
moves[4] = null;
if (isMoveValid(x, y, z, x - 1, y + 1, 0)) {
moves[5][0] = x - 1;
moves[5][1] = y + 1;
moves[5][2] = 0;
else
moves[5] = null;
if (isMoveValid(x, y, z, x, y + 1, 0)) {
moves[6][0] = x;
moves[6][1] = y + 1;
moves[6][2] = 0;
else
moves[6] = null;
if (isMoveValid(x, y, z, x + 1, y + 1, 0)) {
moves[7][0] = x + 1;
moves[7][1] = y + 1;
moves[7][2] = 0;
else
moves[7] = null;
if (isMoveValid(x, y, z, x, y, z + 1)) {
moves[8][0] = x;
moves[8][1] = y;
moves[8][2] = z + 1;
else
moves[8] = null;
return moves;
private void fillpath2D(int sX, int sY, int gX, int gY) {
int[] gLoc = {gX, gY};
path2D.add(gLoc);
int x = gX;
int y = gY;
int z = 0;
while (x != sX || y != sY) {
int x2 = squares3DReference[x][y][z][0];
int y2 = squares3DReference[x][y][z][1];
int z2 = squares3DReference[x][y][z][2];
x = x2;
y = y2;
z = z2;
if (z == 0) {
int[] loc = {x, y};
path2D.insertElementAt(loc, 0);
PathFinderTest.java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Vector;
public class PathFinderTest {
  static BufferedReader consoleReader = new BufferedReader(new InputStreamReader(System.in));
  static Map map;
  static int startX;
  static int startY;
  static int goalX;
  static int goalY;
  public static void main(String[] args) throws Exception {
    System.out.print("Enter map size.\nx = ");
    int width = Integer.parseInt(consoleReader.readLine());
    System.out.print("y = ");
    int height = Integer.parseInt(consoleReader.readLine());
    System.out.print("Enter strting location.\nx = ");
    startX = Integer.parseInt(consoleReader.readLine()) - 1;
    System.out.print("y = ");
    startY = Integer.parseInt(consoleReader.readLine()) - 1;
    System.out.print("Enter goal location.\nx = ");
    goalX = Integer.parseInt(consoleReader.readLine()) - 1;
    System.out.print("y = ");
    goalY = Integer.parseInt(consoleReader.readLine()) - 1;
    if (goalX < 0 || goalY < 0 || startX < 0 || startY < 0 || goalX >= width || goalY >= height || startX >= width || startY >= height) {
      System.out.println("Invalid parameters found. Program will exit");
      System.exit(0);
    map = new Map(width, height);
    map.clearGoalAndStartLocFromWater(startX, startY, goalX, goalY);
    printSolution(new Vector());
    PathFinder pathFinder = new PathFinder(map);
    long before = System.currentTimeMillis();
    Vector path = pathFinder.findPath(startX, startY, goalX, goalY);
    long after = System.currentTimeMillis();
    long time = after - before;
    printSolution(path);
    if (path.size() == 0)
      System.out.println("No path found.");
    else
      System.out.println("Path found.");
    System.out.println("Finding the path took " + time + " milliseconds");
  static void printSolution(Vector path) {
    boolean[][] pathOnMap = new boolean[map.getMapWidth()][map.getMapHeight()];
    for (int i = 0; path.size() > i; i++) {
      int[] move = (int[]) path.get(i);
      pathOnMap[move[0]][move[1]] = true;
    for (int y = 0; y < map.getMapHeight(); y++) {
      for (int x = 0; x < map.getMapWidth(); x++) {
        System.out.print(" ");
        if (pathOnMap[x][y] == false)
          System.out.print(" ");
        else
          System.out.print("0");
        if (x == startX && y == startY)
          System.out.print("S");
        else if (x == goalX && y == goalY)
          System.out.print("G");
        else
          System.out.print(map.terrainTypes.getNameFirstLetter(map.getSquareID(x, y)));
      System.out.println();
    System.out.println();
}TerrainType.java:
public class TerrainType {
  private int movementCost;
  private String name;
  TerrainType(int aMovementCost, String aName) {
    movementCost = aMovementCost;
    name = aName;
  public int getMovementCost() {
    return movementCost;
  public String getName() {
    return name;
  public String getNameFirstLetter() {
    return name.substring(0, 1).toUpperCase();
}TerrainTypes.java:
import java.util.Vector;
public class TerrainTypes {
  //Here are saved the terrain types with the map has. ElementAt 'i' in
  //setOfTypes is represented by the number in Map.terrain[x][y] witch is
  //equal to i, were x, y are random integer as soon as they do not
  //throw ArrayIndexOutOfBoundsException. Actually this is a coding to know
  //a specific square in the map to witch terrain type is refered in setOfTypes.
  private Vector setOfTypes;
  public TerrainTypes() {
    setOfTypes = new Vector();
    setOfTypes.add(new TerrainType(1, "Plains"));
    setOfTypes.add(new TerrainType(2, "Forst"));
    setOfTypes.add(new TerrainType(3, "Jungle"));
    setOfTypes.add(new TerrainType(4, "Mountain"));
    setOfTypes.add(new TerrainType(-1, "X"));
  public int getMovementCost(int i) {
    return ((TerrainType) setOfTypes.get(i)).getMovementCost();
  public String getName(int i) {
    return ((TerrainType) setOfTypes.get(i)).getName();
  public String getNameFirstLetter(int i) {
    return ((TerrainType) setOfTypes.get(i)).getNameFirstLetter();
  public int getHighestMovementCost() {
    int max = 1;
    for (int i = 0; setOfTypes.size() > i; i++) {
      int movementCost = ((TerrainType) setOfTypes.get(i)).getMovementCost();
      if ( movementCost > 0) {
        if (max < movementCost)
          max = movementCost;
    return max;
}I hope this program will be helpful.
Sogartar

Why is such a smart guy like you not using A*
It is a general known algorithm which will find the
optimal solution in a finite search-space (within a minimal time).
The calculation time for the A* algorithm is influenced by two parameters:
1 - cumulative cost
2 - minimal expected additional cost
The calculation of these two costs has a great influence on the
solution.
I think the actual problems most games experience with shortest path calculatoin are
1 - very little time to spent calculating the shortest path
The quickest solution might be the best for the game
If your solution takes 1 second for the calculation of a path for one element on the board (100x100)
What would it take for the game to calculate the path for all elements controlled by the computer ??
If the computer controls two players which each have 50 elements to control, it would take forever...
Don't even consider the usage of a larger board (200x200 would take 4 seconds/element when
algorithm has complexity O(n))
2 - low priority.
Users tend to forgive a bad shortest path-algorithm most of the time,
but not a bad display, bad pictures,...
This is why most shortest-path algorithms within games were
developed as a depth first search,
within some earlier games this was even developed as
a rule which went straight to the endlocation and
takes a right/left turn when blocked by water/wall/...
So the actual steps you should take are:
1 - develop a normal breath-first search (to get going)
2 - develop a normal depth-first search (to compare speed and solution with)
3 - develop a normal dijkstra algorithm (sometimes called A)
4 - develop a best first algorithm (called A*)
5 - develop other AI-algorithms building upon A* (tabu-search, limited memory A*,...)
6 - develop some other AI-algorithms (Genetic Algorithms, Simulated Annealing,...)
7 - compare and tweak/change all search-algorithms for
7 - a - size of maps (small versus huge)
7 - b - optimality of the solution
7 - c - actual usage for your game
8 - !!! very important !!!
Share the developed path algorithms along with remarks about speed, map-size,...
with the rest of us. I would be very interested in such library.
kind regards,

Similar Messages

  • One to Many Mapping with different SQL types

    We have an interesting one to many relationship in our system in which the source and target field SQL types do not match, but the values do. The relationship is actually between multiple entries in the same database table. So, imagine we have some table that looks sort of like this:
    KEY ObjectID OwnerNo
    100 1234     0
    101 ABCD     1234
    102 EFGH     1234ObjectID is defined as a varchar type, but Parent entries are guaranteed to have integer value ObjectIDs. Child entries point to the parent through the OwnerNo field, which defined in the database as a numeric.
    A simple one-to-many mapping will give you the following SQL error on execution: [SQL0401] Comparison operator = operands not compatible.
    I tried modifying my descriptor after load as follows:
       public static void modifyOneToMany(Descriptor descriptor)
           ExpressionBuilder builder = new ExpressionBuilder();
           Expression exp = builder.getField("OwnerNo").
              equal(builder.getField("ObjectID").toNumber());
           descriptor.getMappingForAttributeName("children")
              .setSelectionCriteria(exp);
       }But this introduces two problems in the generated SQL ( ... WHERE ((t0.OwnerNo = TO_NUMBER(t0.ObjectID) ... ). First, this generates a where clause using the function TO_NUMBER, which is not supported by DB2 on AS400, our database platform. Second, the table reference is off in the generated SQL--I couldn't find a way to specify that the right hand side of the = operator should be from the parent of the one to many mapping--both sides are referenced from the child context (t0).

    I found the getFunction() method on Expression, so I can solve half of this problem with the following code:
       public static void modifyOneToMany(Descriptor descriptor)
         if (descriptor.getMappingForAttributeName("children").isOneToManyMapping())
           OneToManyMapping map = (OneToManyMapping) descriptor.
                                  getMappingForAttributeName("children");
           DatabaseField objectID= (DatabaseField) map.getSourceKeyFields().get(0);
           DatabaseField ownerNo = (DatabaseField) map.getTargetForeignKeyFields().get(0);
           ExpressionBuilder builder = new ExpressionBuilder();
           Expression exp = builder.getField(ownerNo).getFunction("CHAR").
                            equal(builder.getField(objectID));
           map.setSelectionCriteria(exp);
       }This generates the following where clause:
    ... WHERE ((CHAR(t0.OwnerNo) = t0.ObjectID) ...
    But, I still have two questions:
    1. How do we get the right hand side of this comparison to reference the Parent part of the 1-M mapping?
    2. Since character and numeric conversions are pretty standard SQL functions, is there something wrong with the DB2 database platform I'm using?

  • Layer 7 class-map with different match types

    Hello,
    I am fighting with a problem on an ACE-4710 version A3(2.4) configuation. I just want to configure a layer 7 class-map that matches if one of two conditions is true. The problem is that these conditions are not from the same type and the ACE refuses the second match statement. However, in the configuration guide, it is clearly defined that it should be possible :
    Here is what the configuration guides says :
    host1/Admin(config)# class-map type http loadbalance match-any CLASS3
    host1/Admin(config-cmap-http-lb)# 100 match http url .*.gif
    host1/Admin(config-cmap-http-lb)# 200 match http header Host header-value XYZ
    host1/Admin(config-cmap-http-lb)# exit
    If I test exactly the same configuration in a context of my ACE, I receive an error message :
    CH01AC03/P-104-A(config)# class-map type http loadbalance match-any CLASS3
    CH01AC03/P-104-A(config-cmap-http-lb)# 100 match http url .*.gif
    CH01AC03/P-104-A(config-cmap-http-lb)# 200 match http header Host header-value XYZ
    Error: Match-any classmap can not have different type of match
    If I use nested class-maps, I receive the same error message !
    Is it a known problem or is it a solution for it ?
    Thank you for any help
    Yves

    Hello Yves,
    The command error is correct.  I'll take a look at the docs and see about getting them corrected, if necessary.
    Basically, for a match-all, you would have to use different types.  For example, there will only be one Host header, so you would only specify it once using regex or a fixed string.  As you found out, the match-any requires that they all be of the same type.  See my example below:
    class-map type http loadbalance match-all HEADER-AND-URL
      100 match http url /login.*
      200 match http header Host header-value "XYZ"
    class-map type http loadbalance match-any URLS
      100 match http url .*\.gif
      200 match http url .*\.jpg
    class-map type http loadbalance match-any HEADER
      200 match http header Host header-value "CISCO"
    policy-map type loadbalance first-match SLB_LOGIC
      class HEADER-AND-URL
        serverfarm LOGIN-FARM
      class URLS
        serverfarm IMAGES-FARM
      class HEADER
        serverfarm CISCO-FARM
      class class-default
        serverfarm WWW-FARM
    So let's say you want to match requests for URLs ending in .jpg or for requests with Host header XYZ, and if it matches either one, then send to the same serverfarm.
    class-map type http loadbalance match-any URL-JPG
      2 match http url .*\.jpg
    class-map type http loadbalance match-any HOST-XYZ
      2 match http header Host header-value "XYZ"
    policy-map type loadbalance first-match SLB_LOGIC
      class URL-JPG
        serverfarm SERVER-FARM
      class HOST-XYZ
        serverfarm SERVER-FARM
    If you wanted to send these requests to the farm only if they matched BOTH matches, then you could do it as follows:
    class-map type http  loadbalance match-all HEADER-AND-URL
       100 match http url /login.*
       200 match http header Host header-value "XYZ"
    policy-map type  loadbalance first-match SLB_LOGIC
       class HEADER-AND-URL
         serverfarm LOGIN-FARM
    Hope this helps,
    Sean

  • How to find what are  the  support-teams map with particular componant type

    hi experts,
    i am new in solution manager.. My requirement is when creating the support message in crmd_order t-code i have to give the componant type in transaction data after that in fast entry screen i have to assign support team for that componant type .. here i have to give only valid support team which are map with particular componant type .. when save the support message here i have to check that support team is map with that particular componant type (i.e that support team is belong to that componant type ) .. thats what i have to do in abap development .. so how to find the what are all the support teams mapped with particular componant type .. whether it is stored in any table or ?.. Please give solutions ..
    Regards,
    Kumar..

    Hi Kumaresan-
    I'm not sure I fully understand your requirement but I will try to help out. If you are trying to determine / associate the relevant support team according to which component they are responsible for, this might help.
    The determination of the support team is maintained by configuring rule 13200137 in transaction PFAC_RESPO.
    Click on the Responsibilities Tab
    Create your responsibility based on your support team requirements
    Assign the appropriate Support Team, this data will be taken from the settings you have maintained when creating your org chart in ppoma_crm
    Highlight a responsibility and click Change
    In this table you will see an entry for SAP Component, this is where you identify which support team will be determined based on component

  • How to find users who are running IE with different credentials ?

    How to find users who are running IE with different credentials ? 
    Is there any tool or a solution in the market will help or a i can use GPO or even Power Shell ?
    thnx & Regards ,,

    Hi Salman,
    Based on your description, we can use Windows Credential Manager to check this. Windows Credential Manager stores credentials, such as user names and passwords  that we use to log on to websites or other computers on a network.
    Regarding Credential Manager, the following article can be referred to for more information.
    Credential Manager
    http://windows.microsoft.com/en-in/windows7/what-is-credential-manager
    Manage passwords in Internet Explorer using Credential Manager
    http://www.thewindowsclub.com/manage-passwords-internet-explorer-10
    Please Note: Since the above website is not hosted by Microsoft, the link may change without notice. Microsoft does not guarantee the accuracy of this information.
    Best regards,
    Frank Shen

  • Posting of cross company transaction with different doc types

    Hi,
    The scenario is:-
    We have two companies X and Y.
    X makes a payment to Y with the following FI entries:-
    Company Code X
    Dr Vendor Y
    Cr Bank HDFC
    Company Code Y
    Dr Bank ICICI
    Cr Customer X
    Now this needs to be a cross company transaction where the doc type for CC X should be vendor Payment 'KZ' while the doc type for CC Y should be a customer reciept with doc type 'DZ'.
    Although I am able to map the accounts in cross company code config I am not able to split the transaction of different company codes with different document types.
    Is there any way we can do this in standard SAP?
    Thanks in advance,
    Nitish

    Hi
    As per your issue ...There are no possibilities to post   in sap with different document types.
    If you want you can post cross company code transactions with one document types
    Regards
    vamsi

  • BDC for MM with different material types.

    Hi, Can anyone explain me how the MM01 tcode can be handled in BDC, when material with different material types are present in the flat file. Different material types have different views and hence different recordings....How to handle this scenario?

    Based on different types of material, you can able to find out which all views are required to call through BDC. Try to find out views by using tables MARA, MAKT, MARD, MARC etc. Once it is confirmed you can call views using screen numbers.
    Here I don't think so more than one recording is required. Record MM01 transaction using Basic Data1, once you go inside the transaction select all the views required to complete the MM01 transaction. It will record all the views (hence screen numbers), then you can switch/call views based on screen numbers.
    Hope this helps you to resolve your query.

  • Vendor Payment with different document types

    Dear Sapguru,
    We have a scenario where a particular vendor payable is in two different document types for example, RE and KZ.
    When we execute TC F110, the payment proposal is grouping the payments by document type. I.e. it grouped all the documents under type RE and grouped all the documents under type KZ and created two line items in the payment proposal.
    Actually, we want to have a single group consisting of all the document types payable to the vendor.
    We have checked different SAP notes and also verified out system settings, but the problem still remains.
    Can somebody let us know how to group all the open items in a single line item in F110 irrespective of document types.
    Thanks in Advance.
    Regards.,
    Rama

    Dear Naravi,
    the main factor which affects the grouping of items is the Structure ZHLG1:
    ZBUKR
    ABSBU
    LIFNR
    KUNNR
    EMPFG
    WAERS
    ZLSCH
    HBKID
    HKTID
    BVTYP
    SRTGB
    SRTBP
    XINVE
    PAYGR
    UZAWE
    DTWS1
    DTWS2
    DTWS3
    DTWS4
    KIDNO
    All these fields have to coincide, to have a single payment.
    Please check why two documents with different document type are paid into two different payments.
    Read the SAP notes 109233 and 164835 and 305414 as well.
    I hope this helps.
    Mauri

  • Reading fixed length file with different record types

    Hi,
    I need to read a fixed-length file with different record types, but the record identifier is in 31st position and not in 1st position.
    But if I give 31 as position in File adpater wizard, BPEL takes whole 1-31 as identifier.
    How we need to read such files.
    Thanks
    Ravdeep

    hi ,
    u cannot use the default wzard for this
    use some thing like this nxsd:lookAhead="30" nxsd:lookFor="S"have a look at the below link it has some examples
    http://download.oracle.com/docs/cd/B31017_01/integrate.1013/b28994/nfb.htm

  • Delivery split with different delivery types

    Hi,
    I’ve got the following problem with delivery split:
    In my order (type ZTA) I have two items with two different item categories (for example TA1 and TA2). For these two items two different deliveries with two different delivery types (for example item TA1 in LF1 and TA2 in LF2) should be created. For this I implemented the needed copy control and in the customizing of the order type ZTA I maintained LF1 as a default delivery type. When I deliver the order manually via Transaction VL01N, I have no problem, because the system delivers first the item which can be delivered with delivery type LF1. Then I have to start VL01N again, predefine LF2 as delivery type and then the other item will be delivered with LF2. But this doesn’t work in the Batch Collective Processing with VL04, VL10A or even VL10Batch. The system can’t deliver the order. And in none of these mentioned transactions I have the possibility to predefine a delivery type. I tried also a routine in the copy control on item category level where I want to switch to a different delivery type in case of the second item category. But it didn’t work. And I couldn’t find any other appropriate exit how to influence the delivery type on base of the item category. What can’t be changed is probably that I will always have to deliver this order two times because the system won’t be able to split the order in one collective processing and create two deliveries at once. That wouldn’t be a big problem if I could predefine the delivery type for the second collective processing in order to get the second item delivered.
    Is there anybody who can help me?
    Kind Regards
    Stephan

    Hi,
    thank you for your quick answer. That was a big help and I will do your suggested solution with the BDC.
    But if I understand you correctly, you also didn't find a solution for this problem in the SAP Standard functions (without BDS)?
    Kind regards
    Stephan

  • IDOC - IDOC scenario with different message types

    Dear Experts
    I will like to have your expert opinion in the following question:
    I have an IDOC -> IDOC scenario. Wherein at the destination system I have a message type which does not exist at the source system.
    Also the IDOC type at destination system does not exist at the source system.
    Let say, I will be creating custom message type at source system (Z****) and will also be creating the custom IDOC type (z****) with the same structure, definition as the destination.
    Now my question is, even if there will be different message types and different IDOC types but with the same structure (the segment level definition
    and field attribute remains the same at both the system). The difference lies with the names. And I have proper mapping though process code.
    Will I be able to receive the IDOC correctly at destination?
    Thanks & Best Regards

    Hi All
    I figured out the answer myself now.
    You got to have same name for message type. All of you said this and this is rite.
    Coming to IDOC type, I did not really got clear idea on this from this discussion.
    But after working on a scenario, I learnt that, you can have different names for IDOCs, but provided that, whichever IDOC type the source system is sending, the same type must exist in your destination as well. Otherwise, system wont process your IDOC. But from mapping point of view, its upto individual how do thay handle mapping inside inbound process code for different idoc types / strucutes.
    Lesson learnt by me, ideally try to keep same name for both logical message and idoc type at both source and destination. If possible try to keep the structure level also the same. This is my view, learnt it the hard way.
    Cheers
    Shane

  • PR generated with different doc type in rollout porject ....why?

    Dear Friends.
    We have done rollout.
    Earlier imlementation - c. code=A200 .
    Using standard document type-NB for PR generation.
    Latest Rollout - c. code =A100
    Using copy of standard document type NB as ZNB for PR generation.
    My problem is that when in A100 MRP runs it generates PR with doc. type-NB (NOT ZNB) why?
    same way PR generated by Plant maintanace module(PM) in doc.type-NB(Not ZNB) why?
    Regards,
    Mahesh.

    Hi,
    Check the below path of configuration, PR created with MRP run have different document type.
    SPROMM-Consumption based planningplanningprocurement proposalDefine external procurement.
    Hope it will help you
    Thanks

  • Same Input name with different data type cause the reflection exception

    I have a proxy contains couple RFCs. Two RFCs contain an argument named IN_COMPANY_CODE with data type of ZTRE_FX_BUKRSTable. Another RFC contains the same argument name of IN_COMPANY_CODE but hold different data type (String). All RFCs are in the same proxy. Complie and build the application with no issue.
    But when I ran the RFC, it generates the reflection exception below:
    Method SAPProxy1.Z_F_Tre_R_Pre_Trade_Fx can not be reflected. --> There was an error reflecting 'In_Company_Code'. > The XML element named 'IN_5fCOMPANY_--5fCODE' from namespace '' references distinct types System.String and MSTRFOREX.ZTRE_FX_BUKRSTable. Use XML attributes to specify another XML name or namespace for the element or types.
    I realize the conflict introduced by the same name with difference data type. But I would like to know if this is fixable as a bug or if there is any best practice and/or some manual intervention to make it work.

    Please install fix from OSS note 506603. After this, right-click .sapwsdl file and select "Run custom tool".

  • APP - F110 - Payment of multiple invoices with different document type

    Hi
    Vendor X has been assigned with payment method same with two document types. One document type got 4 invoices and other document type got 1 invoice.
    During payment run (F110) for each document type, the system picked up both the document type but listed them as two separate lines in the proposal list. When we process the payment the system also created two payment documents.
    Is there a way for these two document types to be processed as a single proposal and payment.
    Any suggestion how can we process these invoices together in a single proposal/payment document?
    Thanks & Regards,
    Sam

    Thanks

  • Same functions with different return types in C++

    Normally the following two functions would be considered the same:
    int getdata ( char *s, int i )
    long getdata ( char *s, int i )
    Every other compiler we use would resolve both of these to the same function. In fact, it is not valid C++ code otherwise.
    We include some 3rd party source in our build which sometimes messes with our typedefs causing this to happen. We have accounted for all of the function input types but never had a problem with the return types. I just installed Sun ONE Studio 8, Compiler Collection and it is generating two symbols in our libraries every time this occurs.
    Is there a compiler flag I can use to stop it from doing this? I've got over 100 unresolved symbols and I'd rather not go and fix all of them if there is an easier way.

    Normally the following two functions would be
    considered the same:
    int getdata ( char *s, int i )
    long getdata ( char *s, int i )Not at all. Types int and long are different types, even if they are implemented the same way.
    Reference: C++ Standard, section 3.9.1 paragraph 10.
    For example, you can define two functions
    void foo(int);
    void foo(long);
    and they are distinct functions. The function that gets called depends on function overload resolution at the point of the call.
    Overloaded functions must differ in the number or the type of at least one parameter. They cannot differ only in the return type. A program that declares or defines two functions that differ only in their return types is invalid and has undefined behavior. Reference: C++ Standard section 13.1, paragraph 2.
    The usual way to implement overloaded functions is to encode the scope and the parameter types, and maybe the return type, and attach the encoding to the function name. This technique is known as "name mangling". The compiler generates the same mangled name for the declaration and definition of a given function, and different mangled names for different functions. The linker matches up the mangled names, and can tell you when no definition matches a reference.
    Some compilers choose not to include the return type in the mangled name of a function. In that case, the declaration
    int foo(char*);
    will match the definition
    long foo(char*) { ... }
    But it will also match the definitions
    myClass foo(char*) { ... }
    double foo(char*) { ... }
    You are unlikely to get good results from such a mismatch. For that reason, and because a pointer-to-function must encode the function return type, Sun C++ always encodes the function return type in the mangled name. (That is, we simplify things by not using different encodings for the same function type.)
    If you built your code for a 64-bit platform, it would presumably link using your other compilers, but would fail in mysterious ways at run time. With the Sun compiler, you can't get into that mess.
    To make your program valid, you will have to ensure your function declarations match their definitions.

Maybe you are looking for

  • What should I do? Has other people's Support been this bad?

    My name is Mile Marjanovich and I am an unhappy Verizon Wireless customer. I have been a customer since October 2004 and finally after 7 years I think it's time to call it quits with this company. Their network may have been one of the most reliable

  • Advice Needed

    After finally being disenchanted by PC's and being engrossed by my iPhone I am looking to buy a 13" macbook pro (restricted to the 13" for cash reasons). I occasionally use 3D modelling for my work (teacher), but nothing too advanced. The majority of

  • My iPod Touch is in Recovery Mode and iTunes Won't Detect It ?

    iPod Touch 4G iOS 5.1 Purchased 2010 I Opened Up iTunes and Upgraded to iOS 5.1.1 from 5.1 as a "Download Only". The Next Morning I Go To My Computer Plug In My iPod and Update. My iPod Then Goes into Recovery Mode and When I Quit Recovery mode It go

  • WebLogic looking for class file using the wrong case

    During my ant build, I precompile my JSPs using weblogic.jspc. All of the jars and wars are packaged into an ear and deployed to WebLogic 8.1 on Linux. When I access one of our normal screens, everything is good. Things go wrong when I try to access

  • Capturing action Event in the Embedding View

    Hi Experts,               I embedded View B in the View A through View UI Element Container, Now through the WDMODIFYVIEW we are creating elements in the View B. Now  we need to create elements based upon the Actions performed in the View A. How to c